私のアクションでは、AJAXリクエストから呼び出された場合にのみ処理で応答したいと思います。どうすれば確認できますか?
私はこのようなことをしたい:
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
AJAXリクエストであるかどうかを確認するには、header[X-Requested-With]
を確認できます。ここに良い方法があります 記事 その方法について。
以下に例を示します。
if request.xhr?
# respond to Ajax request
else
# respond to normal request
end
リンクまたはフォームで:remote => true
を使用している場合は、次のようにします。
respond_to do |format|
format.js { #Do some stuff }
request.xhr?
を呼び出すことで、respond_toブロックの前に確認することもできます。
ドキュメントは、request.xhr?
Returns true if the “X-Requested-With” header contains “XMLHttpRequest”....
しかし、それに注意してください
request.xhr?
=〜に従って、ドキュメントが言うようにブール値ではなく数値またはnil値を返します。
irb(main):004:0> /hay/ =~ 'haystack'
=> 0
irb(main):006:0> /stack/ =~ 'haystack'
=> 3
irb(main):005:0> /asfd/ =~ 'haystack'
=> nil
これに基づいています:
# File actionpack/lib/action_dispatch/http/request.rb, line 220
def xml_http_request?
@env['HTTP_X_REQUESTED_WITH'] =~ /XMLHttpRequest/
end
そう
env['HTTP_X_REQUESTED_WITH'] =~ /XMLHttpRequest/ => 0
ドキュメント:
http://apidock.com/Rails/v4.2.1/ActionDispatch/Request/xml_http_request%3F
before_action
フィルターの使用が好きです。複数のアクションに同じフィルター/許可が必要な場合は特に便利です。
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