Dans mon action, je souhaite répondre au traitement uniquement s'il a été appelé à partir d'une demande 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
Vous pouvez vérifier pour un header[X-Requested-With]
pour voir s’il s’agit d’une demande AJAX. Voici un bon article sur la façon de le faire.
Voici un exemple:
if request.xhr?
# respond to Ajax request
else
# respond to normal request
end
Si vous utilisez :remote => true
dans vos liens ou formulaires, vous feriez:
respond_to do |format|
format.js { #Do some stuff }
Vous pouvez également vérifier avant le bloc respond_to en appelant request.xhr?
.
Les docs disent que request.xhr?
Returns true if the “X-Requested-With” header contains “XMLHttpRequest”....
Mais attention,
request.xhr?
retourne des valeurs numériques ou nil pas des valeurs BOOLEAN comme le dit la documentation, conformément à = ~.
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 ceci:
# File actionpack/lib/action_dispatch/http/request.rb, line 220
def xml_http_request?
@env['HTTP_X_REQUESTED_WITH'] =~ /XMLHttpRequest/
end
alors
env['HTTP_X_REQUESTED_WITH'] =~ /XMLHttpRequest/ => 0
Les docs:
http://apidock.com/Rails/v4.2.1/ActionDispatch/Request/xml_http_request%3F
J'aime utiliser before_action
filtres. Ils sont particulièrement agréables lorsque vous avez besoin du 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