Los rieles detectan si la solicitud fue AJAX

128

En mi acción, deseo responder solo con el procesamiento si fue invocado desde una solicitud AJAX. ¿Cómo lo reviso?

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
Tormenta de afeitar
fuente

Respuestas:

249

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

Aquí hay un ejemplo:

if request.xhr?
  # respond to Ajax request
else
  # respond to normal request
end
Amir Raminfar
fuente
Advertencia: esto no funciona en remote: truellamadas estándar en versiones más recientes de Rails, ya que los encabezados necesarios no se configuran.
Roland Studer
14

Si está utilizando :remote => truesus enlaces o formularios, haría:

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

También puede verificar antes del bloque respond_to llamando request.xhr?.

Sean Hill
fuente
26
Una solicitud ajax no necesariamente tiene que responder con javascript, $.ajax({dataType: 'html'})es ajax que responde con HTML. La forma correcta de hacer esto es la segunda que mencionórequest.xhr?
Pablo Fernández, el talón
3

Los documentos dicen que request.xhr?

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

Pero ten cuidado

request.xhr? 

devuelve valores numéricos o nulos, no valores BOOLEAN como dicen los documentos, 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

entonces

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

Los documentos:

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

pixelearth
fuente
¿Cuál es la diferencia entre truythy y boolean? ambos no son verdaderos / falsos?
Arnold Roa
Verdad significa que cuando se usa en un contexto "booleano", debe tratarlos no como booleanos, sino como aquellos que se convertirán en booleanos. Arriba env ['HTTP_X_REQUESTED_WITH'] = ~ / XMLHttpRequest / devuelve 0 no falso. Y 0 es realmente verdadero, no falsey en ruby: 0 || 1 => 0 Pero voy a alterar mi publicación para mayor claridad.
pixelearth
Pero es cierto que es cierto, el cero significa que el texto se encuentra en el índice 0, por lo que se encuentra (y su solicitud y ajax). Si no se encuentra el texto, el resultado niles falso.
Arnold Roa
2
Sí, pero la convención es generalmente para nombre_método? para devolver BOOL, así que esto es un problema
pixelearth
0

Me gusta usar before_actionfiltros. Son especialmente agradables cuando necesita el mismo filtro / autorización para múltiples acciones.

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
Harlem Ardilla
fuente
0
request.xhr? 

si esto devuelve 0, entonces significa que es una solicitud ajax, de lo contrario devolverá nil

vidur punj
fuente