只有在手动将URL输入浏览器时才会出现此错误。如果我点击我网站上的"注销"链接,它会很好地将用户注销。这是我的"注销"链接:
<%= link_to "Sign out", destroy_user_session_path, method: :delete %>
这是完美的。如果用户在地址栏中键入地址,我如何使注销功能正常工作?我知道这与GET和DELETE请求有关。它使用带有链接的DELETE请求,但在手动输入URL时使用GET请求。我该怎么解决这个问题?
添加;
devise_scope :user do
get '/users/sign_out' =>'devise/sessions#destroy'
end
到Routes解决了我的问题。
基本上,当你尝试手动键入url或尝试用新标签点击链接"注销"时,有HTTP GET请求,你会得到No route matches [GET] "/users/sign_out"
,它不存在,因为你只有通过DELETE
在routes.rb
上请求/users/sign_out
,对于解决方案,你可以在config/initializer/devise.rb
中添加它
# The default HTTP method used to sign out a resource. Default is :delete.
config.sign_out_via = Rails.env.test? ? :get : :delete
并在routes.rb
上将DELETE
更改为MATCH
请求
例如:match 'users/sign_out' => "devise/sessions#destroy"
供参考:设计用于用户管理和身份验证。
老实说,如果要更改默认的"删除"HTTP方法,不建议这样做。供用户测试(例如使用黄瓜)"注销"的Cucumber测试
Jose Valim解释了原因:"GET请求不应该改变服务器。当注销是GET请求时,可以使用CSRF进行签名你会自动退出,预加载链接的东西最终可以你也会错误地退出。">
@manoj mona说"我们不能让用户通过键入URL来注销。是一种糟糕的做法
因此,如果用户通过键入URL来注销。
您可以定义它,如果得到请求,它将重定向或呈现通知(如stackoverflow注销)
或者不使用
link_to
标签进行注销,使用带有表单的input
标签(如facebook注销),因此用户无法键入URL。请参阅此答案
将devise.rb
修改为
config.sign_out_via = :get
并更改链接
<%= link_to "log out", destroy_user_session_path, method: :get %>
将其添加到application.js
:
//= require jquery_ujs
我不知道是什么原因(我是ruby on rails的新手),但一旦你在应用程序布局中添加了这一行,你的问题就会得到解决,
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
并保持注销链接如下
<%= link_to "Sign Out", destroy_user_session_path, :method => :delete %>
试试这个
路线内
devise_scope :user do
get '/users/sign_out' => 'sessions#destroy'
end
devise_scope :user do
match '/users/sign_out' => 'sessions#destroy', via: [:get, :delete]
end
我在routes.rb中添加了ActiveAdmin::Devise.config
devise_for :users, ActiveAdmin::Devise.config
它实际上在gem的生成器中,所以我相信它应该在那里,但我注意到它没有添加到我的一些安装中。