回答:
header[X-Requested-With]
AJAXリクエストであるかどうかを確認できます。これを行う方法についての良い記事があります。
次に例を示します。
if request.xhr?
# respond to Ajax request
else
# respond to normal request
end
:remote => true
リンクやフォームで使用している場合は、次のようにします。
respond_to do |format|
format.js { #Do some stuff }
を呼び出して、respond_toブロックの前に確認することもできrequest.xhr?
ます。
$.ajax({dataType: 'html'})
。HTMLで応答するajaxです。これを行う正しい方法は、あなたが言及した2番目の方法ですrequest.xhr?
ドキュメントはその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
nil
はfalseになります。
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
request.xhr?
これが0を返す場合、それはそのajaxリクエストを意味し、そうでなければnilを返します
remote: true
、必要なヘッダーが設定されていないため、新しいRailsバージョンの標準呼び出しでは機能しません。