到目前为止,我刚刚开始使用rails并且相处得很好,而目前我正在尝试使用Devise实现用户身份验证。一切正常,除了退出。我已经将链接注册到我的标题中,如下所示:
<%= link_to 'Sign out', destroy_user_session_path, :method => :delete %>
app/config/initializers/devise.rb
处的文件包含以下内容:
config.sign_out_via = :delete
据我所知,由于Devise使用HTTP DELETE
请求注销,我需要专门设置注销链接DELETE
。但是,点击链接时,请求仍会通过GET
发送,因为我收到此错误:
No route matches [GET] "/users/sign_out"
从Google开始,这似乎是因为我需要与Rails捆绑在一起的jQuery版本,以实现HTTP DELETE
方法的一种polyfill。但是,当我清理所有资产时,我选择使用最新版本的jQuery,因此,这是在我的application.js
文件中:
//= require jquery-2.1.0
//= require bootstrap
//= require plupload.full.min
即使包含jQuery,它仍然会通过GET
发送请求。有些人建议我在我尝试过的布局中使用<%= javascript_include_tag :defaults %>
,而defaults.js
上的404就像这样:
No route matches [GET] "/javascripts/defaults.js"
是否有人能够更多地解释这里发生的事情以及解决此问题的必要步骤?我知道我可以告诉Devise使用GET
注销,但这只是避免了这个问题。
答案 0 :(得分:6)
来自超链接的非GET请求本身不受支持,因此您需要使用javascript代码来执行此操作。这就是jquery-ujs所做的事情(除其他事项外),但您可能在清理资产时将其删除了。
您可以包含jquery-ujs脚本,但根据文档,它与jQuery 2.0或更高版本不兼容。如果你想继续使用最新的jQuery版本,那么这不是一个选择。
其他选项是使用button_to
助手。它会创建一个隐藏输入的表单,其名称为 _method , delete 为值。它将使用POST但rails可以解释_method字段并找到正确的路由,使Devise注销工作。
<%= button_to 'Sign out', destroy_user_session_path, method: :delete %>
希望它有所帮助。