Schienen erkennen, ob die Anforderung AJAX war

127

In meiner Aktion möchte ich nur dann mit der Verarbeitung antworten, wenn sie von einer AJAX-Anfrage aufgerufen wurde. Wie überprüfe ich?

Ich möchte so etwas machen:

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
Rasiermessersturm
quelle

Antworten:

248

Sie können nach a header[X-Requested-With]suchen, um festzustellen, ob es sich um eine AJAX-Anforderung handelt. Hier ist ein guter Artikel dazu.

Hier ist ein Beispiel:

if request.xhr?
  # respond to Ajax request
else
  # respond to normal request
end
Amir Raminfar
quelle
Warnung: Dies funktioniert nicht bei Standardaufrufen remote: truein neueren Rails-Versionen, da die erforderlichen Header nicht festgelegt werden.
Roland Studer
14

Wenn Sie :remote => truein Ihren Links oder Formularen verwenden, tun Sie Folgendes:

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

Sie können auch vor dem respond_to Block überprüfen durch den Aufruf request.xhr?.

Sean Hill
quelle
26
Eine Ajax-Anfrage muss nicht unbedingt mit Javascript antworten, sondern $.ajax({dataType: 'html'})ist ein Ajax, der mit HTML antwortet. Der richtige Weg, dies zu tun, ist der zweite, den Sie erwähnt habenrequest.xhr?
Pablo Fernandez
3

Die Dokumente sagen, dass request.xhr?

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

Aber Vorsicht

request.xhr? 

Gibt numerische oder Nullwerte zurück, keine BOOLEAN-Werte, wie in den Dokumenten angegeben, gemäß = ~.

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

Es basiert darauf:

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

so

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

Die Dokumente:

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

Pixelerd
quelle
Was ist der Unterschied zwischen Wahrheit und Booleschem? beide sind nicht wahr / falsch?
Arnold Roa
Wahrhaftig bedeutet, dass Sie sie in einem "booleschen" Kontext nicht als nicht boolesche, sondern als solche behandeln müssen, die in bool umgewandelt werden. Oben env ['HTTP_X_REQUESTED_WITH'] = ~ / XMLHttpRequest / gibt 0 nicht falsch zurück. Und 0 ist tatsächlich wahr, nicht falsch in Rubin: 0 || 1 => 0 Aber ich werde meinen Beitrag aus Gründen der Klarheit ändern.
Pixelearth
Aber um ehrlich zu sein, bedeutet die Null, dass der Text am Index 0 gefunden wird, also gefunden (und seine und Ajax-Anfrage). Wenn kein Text gefunden wird nil, ist das Ergebnis falsch.
Arnold Roa
2
Ja, aber die Konvention gilt im Allgemeinen für Methodenname? BOOL zurückzugeben, so ist dies ein Gotcha
Pixelearth
0

Ich benutze gerne before_actionFilter. Sie sind besonders nützlich, wenn Sie denselben Filter / dieselbe Berechtigung für mehrere Aktionen benötigen.

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
quelle
0
request.xhr? 

Wenn diese 0 zurückgibt, bedeutet dies, dass es sich um eine Ajax-Anforderung handelt, andernfalls wird null zurückgegeben

vidur punj
quelle