2011-11-22 6 views
117

En mi acción solo deseo responder con el proceso si fue llamado desde una solicitud AJAX. ¿Cómo lo verifico?Los rieles detectan si la solicitud fue AJAX

quiero hacer algo como esto:

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 

Respuesta

233

Puede consultar un header[X-Requested-With] para ver si se trata de una solicitud de AJAX. Aquí hay un buen article sobre cómo hacerlo.

Aquí se muestra un ejemplo:

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

Si está utilizando :remote => true en sus enlaces o formas, que haría:

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

También puede comprobar antes de la respond_to bloquear llamando al request.xhr?.

+24

una petición Ajax no necesariamente tienen que responder con javascript , ' $ .ajax ({dataType: 'html'}) 'es ajax que responde con HTML. La forma correcta de hacerlo, es la segunda que mencionó 'request.xhr?' –

0

Sé consciente de que

request.xhr? 

devuelve los valores numéricos o nulo no valores booleanos como los documentos dicen que, de acuerdo con ~ =.

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

Se basa en esto:

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

por lo

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

Los documentos:

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

+0

¿cuál es la diferencia entre truythy y boolean? ambos no son verdaderos/falsos? –

+0

Truthy significa que cuando se utiliza en un contexto "booleano", debe tratarlos no como booleanos, sino como booleanos. Sobre env ['HTTP_X_REQUESTED_WITH'] = ~/XMLHttpRequest/devuelve 0 no falso. Y 0 es realmente cierto, no falsey en ruby: 0 || 1 => 0 Pero voy a alterar mi publicación para mayor claridad. – pixelearth

+0

Pero, para ser sincero, el cero significa que el texto se encuentra en el índice 0, por lo que se encuentra (y su petición es ajax). Si no se encuentra el texto, el resultado es 'nil', que es falso. –

Cuestiones relacionadas