注销链接与Devise on Rails 3

Joh*_*ean 2 ruby jquery ruby-on-rails devise ruby-on-rails-3

到目前为止,我刚刚开始使用rails并且相处得很好,而目前我正在尝试使用Devise实现用户身份验证.一切正常,除了退出.我已经在我的标题中注销了这样的链接:

<%= link_to 'Sign out', destroy_user_session_path, :method => :delete %>
Run Code Online (Sandbox Code Playgroud)

并且文件at app/config/initializers/devise.rb具有以下设置:

config.sign_out_via = :delete
Run Code Online (Sandbox Code Playgroud)

据我所知,自Devise使用HTTP DELETE请求注销后,我需要专门设置注销链接DELETE.但是,当点击链接时,仍然会发送请求GET,因为我收到此错误:

No route matches [GET] "/users/sign_out"
Run Code Online (Sandbox Code Playgroud)

从谷歌看来,这似乎是因为我需要与Rails捆绑在一起的jQuery版本,以实现HTTP DELETE方法的一种polyfill .但是,当我清理所有资产时,我选择使用最新版本的jQuery,因此,这是在我的application.js文件中:

//= require jquery-2.1.0
//= require bootstrap
//= require plupload.full.min
Run Code Online (Sandbox Code Playgroud)

即使包含jQuery,它仍然会发送请求GET.有些人建议我<%= javascript_include_tag :defaults %>在我尝试过的布局中使用,而且只有404就是defaults.js这样:

No route matches [GET] "/javascripts/defaults.js"
Run Code Online (Sandbox Code Playgroud)

有人能够解释一下这里发生了什么以及解决这个问题的必要步骤吗?我知道我可以告诉Devise用来GET退出但这只是避免了问题.

小智 6

来自超链接的非GET请求本身不受支持,因此您需要javascript代码才能执行此操作.这就是jquery-ujs所做的事情(除其他事项外),但您可能在清理资产时将其删除了.

您可以包含jquery-ujs脚本,但根据文档,它与jQuery 2.0或更高版本不兼容.因此,如果您想继续使用最新的jQuery版本,那么这不是一个选项.

其他选择是使用button_to帮助程序.它创建一个带有隐藏输入的表单,名称为_method,delete为value.它将使用POST但rails可以解释_method字段并找到正确的路由,使Devise注销工作.

<%= button_to 'Sign out', destroy_user_session_path, method: :delete %>
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.