RailsはリクエストがAJAXであったかどうかを検出します


128

私のアクションでは、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

回答:


249

header[X-Requested-With]AJAXリクエストであるかどうかを確認できます。これを行う方法についての良い記事があります。

次に例を示します。

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

警告:これはremote: true、必要なヘッダーが設定されていないため、新しいRailsバージョンの標準呼び出しでは機能しません。
Roland Studer

14

:remote => trueリンクやフォームで使用している場合は、次のようにします。

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

を呼び出して、respond_toブロックの前に確認することもできrequest.xhr?ます。


26
ajaxリクエストは必ずしもJavaScriptで応答する必要はありません$.ajax({dataType: 'html'})。HTMLで応答するajaxです。これを行う正しい方法は、あなたが言及した2番目の方法ですrequest.xhr?
Pablo Fernandez heelhook

3

ドキュメントはその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


真実と真偽の違いは何ですか?両方が真/偽ではありませんか?
アーノルドロア2017

真実の意味は、「ブール値」のコンテキストで使用される場合、ブール値ではなくブール値にキャストされるものとしてそれらを処理する必要があることです。上記のenv ['HTTP_X_REQUESTED_WITH'] =〜/ XMLHttpRequest /はfalseではなく0を返します。そして、0は実際には真実であり、ルビーでは偽ではありません。1 => 0しかし、わかりやすくするために投稿を変更します。
pixelearth 2017

しかし、真実であることは問題ありませんが、ゼロはテキストがインデックス0で見つかったことを意味するため、テキスト(およびそのajaxリクエスト)が見つかります。テキストが見つからない場合、結果nilはfalseになります。
アーノルドロア2017

2
はい、しかし慣例は一般的にmethod_nameのためのものですか?BOOLを返すため、これは問題です
pixelearth 2017

0

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

0
request.xhr? 

これが0を返す場合、それはそのajaxリクエストを意味し、そうでなければnilを返します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.