在我的Rails应用中,我使用Devise和jQuery mobile创建移动视图。在用户登录后,我有一个“sign out" 链接并且并且跳转到指定页面。在Rails 3 Devise 中它象下面的代码:
<%= link_to "Log out", "/users/signout", :method=>:delete, :confirm=>" Are you sure to remove", :"data-ajax"=>false %>
在上面的代码中, “/users/signout" 应该写成 destroy_user_session_path(). 写成"/users/signout"只是为了容易理解。
尽管你指定了“data-ajax"的html 属性为false,这个链接并不会跳转,这是由于rails3不仅使用这个链接直接到logout页面,取而代之的是在处理所有的link_to with :method=>:delete 的click事件期间,创建了一个动态表单,它的action属性等于href值,在这个例子里是“/users/signout"
<form action="users/signout" method="post">
<input type="hidden" ....
....
----
</form>
那么提交这个表单, 并阻止link click事件的缺省行为。 这是rails做事的方式, 由于rails是真正的设计为REST的, 并且删除一个会话需要一个DELETE请求。 但是link 只支持get, 为了实现DELETE 请求, rails 在流程中隐含地创建了一个表单, 并不使用link的功能。
为了解决我们的问题,对每一个需要跳转的表单,jQuery要求表单属性"data-ajax"= "false" 。 所以我们需要在表单提交时, 用javascript在表单提交到服务器前, 为其添加"data-ajax"="false" 属性。
$(function(){
$(document.body).delegate("form[action='/users/sign_out']","submit",function(){
$(this).attr("data-ajax","false");
});
});
现在我们可以看到jQuery mobile 可以正确的跳转到新的地址。
高兴的试试吧!!!