Rails, isteğin AJAX olup olmadığını algılar


128

Eylemimde, yalnızca bir AJAX isteğinden çağrıldıysa işleme ile yanıt vermek istiyorum. Nasıl kontrol ederim?

Bunun gibi bir şey yapmak istiyorum:

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

Yanıtlar:


249

header[X-Requested-With]Bir AJAX isteği olup olmadığını kontrol edebilirsiniz. İşte bunun nasıl yapılacağına dair güzel bir makale .

İşte bir örnek:

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

Uyarı: remote: trueGerekli başlıklar ayarlanmadığından, bu yeni Rails sürümlerinde standart çağrılarda çalışmaz .
Roland Studer

14

:remote => trueBağlantılarınızda veya formlarınızda kullanıyorsanız şunları yaparsınız:

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

Ayrıca, yanıtlayarak engellemeden önce arayarak da kontrol edebilirsiniz request.xhr?.


26
Bir ajax isteğinin javascript ile yanıt vermesi gerekmez, $.ajax({dataType: 'html'})HTML ile yanıt veren bir ajaxtır. Bunu yapmanın doğru yolu, bahsettiğiniz ikincisidirrequest.xhr?
Pablo Fernandez

3

Dokümanlar bu request.xhr diyor?

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

Ama DİKKAT

request.xhr? 

= ~ ile uyumlu olarak, dokümanların dediği gibi BOOLEAN değerleri değil sayısal veya nil değerleri döndürür.

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

Buna dayanıyor:

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

yani

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

Dokümanlar:

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


gerçek ve boole arasındaki fark nedir? ikisi de doğru / yanlış değil mi?
Arnold Roa

Gerçek şu anlama gelir: "Boolean" bağlamında kullanıldığında, onları boole olarak değil, bool'a dönüştürülecek olanlar olarak ele almanız gerekir. Env üstünde ['HTTP_X_REQUESTED_WITH'] = ~ / XMLHttpRequest / 0 döndürür yanlış değil. Ve 0 aslında doğrudur, Ruby'de falsey değildir: 0 || 1 => 0 Ama açıklık sağlamak için gönderimi değiştireceğim.
pixelearth

Ancak doğru olması normaldir, sıfır, metnin 0 dizininde bulunduğu anlamına gelir, bu nedenle bulunur (ve onun ve ajax isteği). Metin bulunamazsa sonuç nilyanlıştır.
Arnold Roa

2
Evet, ancak kural genellikle method_name için mi? BOOL döndürmek için, bu yüzden bu bir gotcha
pixelearth

0

before_actionFiltreleri kullanmayı seviyorum . Birden fazla eylem için aynı filtreye / yetkiye ihtiyacınız olduğunda özellikle güzeldirler.

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? 

eğer bu 0 döndürürse bir ajax isteği anlamına gelir, aksi takdirde sıfır döndürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.