Rails mendeteksi jika permintaan adalah AJAX


128

Dalam tindakan saya, saya hanya ingin menanggapi dengan pemrosesan jika itu dipanggil dari permintaan AJAX. Bagaimana saya memeriksanya?

Saya ingin melakukan sesuatu seperti ini:

def action
   @model = Model.find(params[:id])

   respond_to do |format|

      if (wasAJAXRequest()) #How do I do this?

         format.html #action.html.erb

      else

         format.html {redirect_to root_url}
   end
end

Jawaban:


249

Anda dapat memeriksa untuk header[X-Requested-With]melihat apakah itu permintaan AJAX. Berikut ini adalah artikel bagus tentang cara melakukannya.

Berikut ini sebuah contoh:

if request.xhr?
  # respond to Ajax request
else
  # respond to normal request
end

Peringatan: ini tidak berfungsi pada remote: truepanggilan standar di versi Rails yang lebih baru, karena tajuk yang diperlukan tidak disetel.
Roland Studer

14

Jika Anda menggunakan :remote => truetautan atau formulir Anda, lakukan:

respond_to do |format|
  format.js { #Do some stuff }

Anda juga dapat memeriksa sebelum blok response_to dengan menelepon request.xhr?.


26
Permintaan ajax tidak harus merespons dengan javascript, $.ajax({dataType: 'html'})adalah ajax yang merespons dengan HTML. Cara yang tepat untuk melakukan ini, adalah yang kedua yang Anda sebutkanrequest.xhr?
Pablo Fernandez heelhook

3

Docs mengatakan request.xhr itu?

Returns true if the X-Requested-With header contains XMLHttpRequest”....

Tapi WASPADALAH

request.xhr? 

mengembalikan nilai numerik atau nihil bukan nilai BOOLEAN seperti yang dikatakan dokumen, sesuai dengan = ~.

irb(main):004:0> /hay/ =~ 'haystack'
=> 0
irb(main):006:0> /stack/ =~ 'haystack'
=> 3
irb(main):005:0> /asfd/ =~ 'haystack'
=> nil

Ini berdasarkan ini:

# File actionpack/lib/action_dispatch/http/request.rb, line 220
def xml_http_request?
  @env['HTTP_X_REQUESTED_WITH'] =~ /XMLHttpRequest/
end

begitu

env['HTTP_X_REQUESTED_WITH'] =~ /XMLHttpRequest/  => 0

Dokumen:

http://apidock.com/rails/v4.2.1/ActionDispatch/Request/xml_http_request%3F


apa bedanya antara truythy dan boolean? keduanya tidak benar / salah?
Arnold Roa

Yang sebenarnya berarti bahwa ketika digunakan dalam konteks "boolean", Anda harus memperlakukan mereka bukan sebagai boolean, tetapi yang akan dilemparkan ke boole. Di atas env ['HTTP_X_REQUESTED_WITH'] = ~ / XMLHttpRequest / menghasilkan 0 tidak salah. Dan 0 sebenarnya benar, bukan falsey di ruby: 0 || 1 => 0 Tapi saya akan mengubah postingan saya untuk kejelasan.
pixelearth

Tetapi okey untuk menjadi benar, nol berarti bahwa teks ditemukan pada indeks 0, sehingga ditemukan (dan permintaannya dan ajax). Jika teks tidak ditemukan hasilnya adalah nilyang salah.
Arnold Roa

2
Ya, tetapi konvensi ini umumnya untuk method_name? untuk mengembalikan BOOL, jadi ini adalah gotcha
pixelearth

0

Saya suka menggunakan before_actionfilter. Mereka sangat baik ketika Anda membutuhkan filter / otorisasi yang sama untuk beberapa tindakan.

class MyController < AuthController
  before_action :require_xhr_request, only: [:action, :action_2]

  def action
    @model = Model.find(params[:id])
  end

  def action_2
    # load resource(s)
  end

  private

  def require_xhr_request
    redirect_to(root_url) unless request.xhr?
  end
end

0
request.xhr? 

jika ini mengembalikan 0 maka itu berarti permintaan ajax, jika tidak maka akan mengembalikan nihil

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.