web-dev-qa-db-ja.com

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

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

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

以下に例を示します。

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

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

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

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

15
Sean Hill

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

3
pixelearth

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
HarlemSquirrel