ruby-on-rails Rails检测请求是否为 AJAX

dy2hfwbg  于 2022-11-19  发布在  Ruby
关注(0)|答案(6)|浏览(164)

在我的操作中,我希望只有当它是从 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
knpiaxh1

knpiaxh11#

您可以检查header[X-Requested-With]以查看它是否是 AJAX 请求。下面是一个很好的article示例。
以下是一个示例:

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

q8l4jmvw2#

如果您在链接或表单中使用:remote => true,您应该执行以下操作:

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

您还可以通过调用request.xhr?在response_to块之前进行检查。

fhity93d

fhity93d3#

更新:

从Rails 6.1.0开始,xhr?()实际上(最终)返回一个布尔值。
https://github.com/rails/rails/commit/0196551e6039ca864d1eee1e01819fcae12c1dc9#diff-60b77e427ea7ba142faa477fac10b8d0134cede4e35a3b1953c425200fadf1acL267-L269

原始答案:

医生说那个请求.xhr?

Returns true if the “X-Requested-With” header contains “XMLHttpRequest”....

但要注意

request.xhr?

根据=~,返回数值或空值,而不是文档中所说的布尔值。

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

slmsl1lt

slmsl1lt4#

如果您在链接、表单中使用:remote => true,那么您的响应将以js形式出现,而不是HTML、JSON等。

def action
   @model = Model.find(params[:id])

   respond_to do |format|
           format.js
      if (wasAJAXRequest()) #How do I do this?

         format.html #action.html.erb

      else

         format.html {redirect_to root_url}
      end
   end
end

您还需要创建,action相应js文件,在您情况下,action名称是action,因此文件名将是-action.js.erb还需要将我们action代码转移到action.js.erb文件中

piok6c0g

piok6c0g5#

我喜欢使用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
voase2hg

voase2hg6#

request.xhr?

如果返回0,则表示它是一个 AJAX 请求,否则将返回nil

相关问题