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
Storm Razor
sumber

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
Amir Raminfar
sumber
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?.

Sean Hill
sumber
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

pixelearth
sumber
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
HarlemSquirrel
sumber
0
request.xhr? 

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

vidur punj
sumber