Le rotaie rilevano se la richiesta era AJAX


128

Nella mia azione desidero rispondere con l'elaborazione solo se è stato chiamato da una richiesta AJAX. Come posso controllare?

Voglio fare qualcosa del genere:

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

Risposte:


249

Puoi controllare per header[X-Requested-With]vedere se si tratta di una richiesta AJAX. Ecco un buon articolo su come farlo.

Ecco un esempio:

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

Avvertenza: questo non funziona con le remote: truechiamate standard nelle versioni Rails più recenti, poiché le intestazioni necessarie non vengono impostate.
Roland Studer,

14

Se utilizzi i :remote => truetuoi link o moduli, faresti:

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

Puoi anche controllare prima del reply_to block chiamando request.xhr?.


26
Una richiesta Ajax non deve necessariamente rispondere con JavaScript, $.ajax({dataType: 'html'})è Ajax che risponde con HTML. Il modo giusto per farlo è il secondo che hai citatorequest.xhr?
Pablo Fernandez Heelhook,

3

I documenti dicono che request.xhr?

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

Ma ATTENZIONE

request.xhr? 

restituisce valori numerici o nulli non valori BOOLEAN come dicono i documenti, in conformità con = ~.

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

Si basa su questo:

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

così

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

I documenti:

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


qual'è la differenza tra truythy e boolean? entrambi non sono veri / falsi?
Arnold Roa,

Veramente significa che quando usato in un contesto "booleano", non devi trattarli come non booleani, ma quelli che verranno lanciati per booleano. Sopra env ['HTTP_X_REQUESTED_WITH'] = ~ / XMLHttpRequest / restituisce 0 non falso. E 0 in realtà è vero, non falso in rubino: 0 || 1 => 0 Ma ho intenzione di modificare il mio post per chiarezza.
pixelearth,

Ma il suo okey è veritiero, lo zero significa che il testo si trova all'indice 0, quindi viene trovato (e la sua e richiesta ajax). Se il testo non viene trovato, il risultato nilè falso.
Arnold Roa,

2
Sì, ma la convenzione è generalmente per method_name? per restituire BOOL, quindi questo è un gotcha
pixelearth

0

Mi piace usare i before_actionfiltri. Sono particolarmente utili quando hai bisogno dello stesso filtro / autorizzazione per più azioni.

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? 

se questo restituisce 0 allora significa che è una richiesta Ajax, altrimenti restituirà zero

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.