在jQuery mobile - Rails 3 Devise环境下Sign out 后不跳转

在我的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 可以正确的跳转到新的地址。

高兴的试试吧!!!

 PS: 当设置了对ajax请求, 不渲染layout后, 登录的表单需要设置data-ajax='false' ,使登录后, 重新渲染layout, 获得新的csrf_token。 否则logout时, 将不能退出, 需要点击2次,第一次产生can't verify csrf token authenticity 错误, 导致重新渲染layout, 第二次点击后, 由于获得了正确的csrf_token从而正确的退出  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值