Rails关于判断request请求类型的一个bug


def ajax_test
if request.xhr?
render :update do |page|
page.alert("xhr");
end
elsif request.post?
render :update do |page|
page.alert("post");
end
end
end

页面上是表单发送一个ajax请求:
<% form_remote_tag :url => {:action => "ajax_test", :id => @user }, :before => "$('submit_btn').disable();$('loading').show()"  do %>
<% end %>

测试结果是弹出xhr,很正确!不过....

def ajax_test
if request.post?
render :update do |page|
page.alert("post");
end
elsif request.xhr?
render :update do |page|
page.alert("xhr");
end
end
end

测试的结果是post。

bug吧。。

我的rails版本是rails 2.0.2 (都有点不好意思拿出来了... )

你们看一下新版本会有这个bug吗?

佩服你直接质疑是Rails BUG的勇气, 但不得不告诉你, 这是你的问题.

[code="java"]
# Generates:
#


form_remote_tag :html => { :action =>
url_for(:controller => "some", :action => "place") }
[/code]

[code="java"]
<%= link_to_remote "post", {:url => { :action => "ajax_test"} ,:method=>:get } %>
<%= link_to_remote "get", {:url => { :action => "ajax_test" } ,:method=>:post } %>
[/code]

[code="java"]
def ajax_test
if request.xhr?
render :update do |page|
if request.post?
page.alert("post");
end
if request.post?
page.alert("get");
end
end
end
end

[/code]

你的概念有些混淆, post get 跟 xhr 并不是一个概念
post get 是请求方式, 在Rails 里面 还有 delete put

get: 用于得到数据
post: 用于添加数据
delete: 用于删除数据
put: 用于更新数据
这些是一中约定 当然你也可以用 get 来 添加 删除 更新

而 Ajax 是一中局部刷新技术

Ajax 请求同一般的请求一样有 post get delete put
并不是像你所想的 是xhr 就不是 post get delete put 了

你这里的请求是xhr也是post的.