129 votes

Rails détecte si la requête est AJAX

Dans mon action, je ne souhaite répondre par un traitement que si elle a été appelée par une requête AJAX. Comment puis-je vérifier ?

Je veux faire quelque chose comme ça :

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

253voto

Amir Raminfar Points 17939

Vous pouvez vérifier si un header[X-Requested-With] pour voir s'il s'agit d'une demande AJAX. Voici une bonne article sur la façon de le faire.

Voici un exemple :

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

1 votes

Avertissement : cela ne fonctionne pas sur le standard remote: true dans les nouvelles versions de Rails, car les en-têtes nécessaires ne sont pas définis.

14voto

Sean Hill Points 7500

Si vous utilisez :remote => true dans vos liens ou formulaires, vous le feriez :

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

Vous pouvez également vérifier avant le bloc respond_to en appelant request.xhr? .

26 votes

Une requête ajax ne doit pas nécessairement répondre avec du javascript, $.ajax({dataType: 'html'}) est un ajax qui répond avec du HTML. La bonne façon de faire est la deuxième que vous avez mentionnée. request.xhr?

5voto

pixelearth Points 2948

Mise à jour :

A partir de Rails 6.1.0, xhr?() renvoie effectivement (enfin) une valeur booléenne.

https://github.com/rails/rails/commit/0196551e6039ca864d1eee1e01819fcae12c1dc9#diff-60b77e427ea7ba142faa477fac10b8d0134cede4e35a3b1953c425200fadf1acL267-L269


Réponse originale :

Les docs disent que request.xhr ?

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

Mais attention à ce que

request.xhr? 

renvoie des valeurs numériques ou nulles et non des valeurs BOOLEAN comme le dit la docs, en accord avec =~.

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

C'est basé sur ça :

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

donc

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

Les docteurs :

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

0voto

HarlemSquirrel Points 1679

J'aime utiliser before_action les filtres. Ils sont particulièrement utiles lorsque vous avez besoin d'un même filtre/autorisation pour plusieurs actions.

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

0voto

vidur punj Points 506
request.xhr? 

si cela renvoie 0 alors cela signifie que c'est une requête ajax, sinon cela renverra nil

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X