2011-11-22 20 views
117

Nella mia azione desidero rispondere solo con l'elaborazione se è stata chiamata da una richiesta AJAX. Come controllo?Rails rileva se la richiesta era AJAX

voglio fare qualcosa di simile:

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 

risposta

233

È possibile verificare un header[X-Requested-With] per verificare se si tratta di una richiesta AJAX. Ecco un buon article su come farlo.

Ecco un esempio:

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

Se stai usando :remote => true nei tuoi link o forme, faresti:

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

È possibile anche controllare prima della respond_to bloccare chiamando request.xhr?.

+24

una richiesta Ajax non devono necessariamente rispondere con javascript , ' $ .ajax ({dataType: 'html'}) 'è ajax che risponde con HTML. Il modo giusto per farlo è il secondo che hai citato 'request.xhr? ' –

0

essere consapevoli del fatto che

request.xhr? 

restituisce valori numerici o nullo non valori booleani come i documenti dicono, in accordo con = ~.

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

E 'sulla base di 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 

La documentazione:

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

+0

qual è la differenza tra truythy e booleano? entrambi non sono veri/falsi? –

+0

Verità che significa che quando viene utilizzato in un contesto "booleano", devi trattarli non come non booleani, ma come quelli che verranno lanciati in bool. 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

+0

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

Problemi correlati