2011-11-22 153 views
117

在我的操作中,如果从AJAX请求中调用该操作,我希望只处理该请求。我如何检查?Rails检测请求是否为AJAX

我想做的事情是这样的:如果你使用你的链接或表单:remote => true

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 

回答

233

您可以检查header[X-Requested-With]以查看它是否是AJAX请求。关于如何做到这一点,请拨打article

下面是一个例子:

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

,你会怎么做:

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

您还可以在respond_to代码前检查通过呼叫request.xhr?来阻止。

+24

一个Ajax请求并不一定要使用JavaScript响应,' $ .ajax({dataType:'html'})'是用HTML响应的ajax。正确的做法是,你提到的第二个'request.xhr?' –

0

注意

request.xhr? 

返回数值或零值不BOOLEAN值作为文档说,按照=〜。

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

+0

truythy和boolean有什么区别?两者都不是真/假? –

+0

Truthy意思是说,当在“布尔”的上下文中使用时,你必须将它们视为不是布尔值,而是将它们转换为布尔值。上面env ['HTTP_X_REQUESTED_WITH'] =〜/ XMLHttpRequest /返回0不为false。而0实际上是真实的,而不是在红宝石中的虚假:0 || 1 => 0但为了清晰起见,我会改变我的帖子。 – pixelearth

+0

但它的关键是truthy,零意味着文本被找到索引0,所以它的发现(和它的和ajax请求)。如果没有找到文本,结果是'nil',这是错误的。 –