2011-11-22 16 views
117

W moim działaniu chcę tylko odpowiedzieć przetwarzaniem, jeśli zostało wywołane z żądania AJAX. Jak sprawdzić?Szyny wykryły, czy żądanie było AJAX

chcę zrobić coś takiego:

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 

Odpowiedz

233

Możesz sprawdzić, czy jest to header[X-Requested-With], aby sprawdzić, czy jest to żądanie AJAX. Oto dobry article, jak to zrobić.

Oto przykład:

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

Jeśli używasz :remote => true w linkach lub formularzy, można zrobić:

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

Można również sprawdzić przed respond_to blokując przez wywołanie request.xhr?.

+24

AJAX żądanie niekoniecznie muszą reagować z javascript ,, $ .ajax ({dataType: 'html'}) 'to ajax, który odpowiada za pomocą HTML. Właściwy sposób to zrobić, to drugi, o którym wspomniałeś 'request.xhr?' –

0

Należy pamiętać, że

request.xhr? 

zwraca nil wartości liczbowe lub wartości logiczne nie jak docs powiedzieć, zgodnie z = ~.

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

Jest on oparty na to:

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

tak

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

Docs:

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

+0

jaka jest różnica między truythy a boolean? oba nie są prawdziwe/fałszywe? –

+0

Prawda oznacza, że ​​kiedy używa się go w kontekście "boolean", należy traktować je nie jako booleans, ale te, które zostaną rzucone do bool. Powyżej env ['HTTP_X_REQUESTED_WITH'] = ~/XMLHttpRequest/zwraca 0, a nie fałsz. A 0 jest prawdą, a nie falsey w rubin: 0 || 1 => 0 Ale zamierzam zmienić mój post dla jasności. – pixelearth

+0

Ale jest okey być prawdą, zero oznacza, że ​​tekst znajduje się w indeksie 0, więc znajduje się (i jego żądanie ajax). Jeśli tekst nie zostanie znaleziony, wynikiem jest 'nil', który jest fałszywy. –