当我手动将URL输入浏览器时,我才会收到此错误。如果我点击我网站上的“退出”链接,它会将用户记录正常。这是我的“退出”链接:
<%= link_to "Sign out", destroy_user_session_path, method: :delete %>
完美无缺。如果用户在地址栏中键入地址,如何才能使注销功能正常工作?我知道它与GET和DELETE请求有关。它正在使用链接的DELETE请求,但在手动输入URL时使用GET请求。我该如何解决这个问题?
答案 0 :(得分:9)
添加;
devise_scope :user do
get '/users/sign_out' => 'devise/sessions#destroy'
end
到路线解决了我的问题。
答案 1 :(得分:7)
将devise.rb
修改为
config.sign_out_via = :get
并更改链接
<%= link_to "log out", destroy_user_session_path, method: :get %>
答案 2 :(得分:7)
基本上,
当您尝试手动输入网址或尝试使用新标签点击链接“退出”时,会有HTTP GET请求,您将获得No route matches [GET] "/users/sign_out"
,因为您只有{{1},所以它不存在在DELETE
上请求/users/sign_out
,您可以在routes.rb
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
DELETE
更改为MATCH
个请求
例如:routes.rb
供参考:Devise for user management and authentication.
老实说,假设不推荐更改默认的'删除'HTTP方法。用户进行测试(例如使用黄瓜) Cucumber Testing for “Sign Out”
Jose Valim解释了原因:“GET请求不应该改变状态 服务器。当注销是GET请求时,CSRF可用于签名 你自动出来,最终预加载链接的东西 也错误地告诉你。“
@manoj mona说'我们不能让用户通过输入网址退出。这是一个不好的做法'
因此,如果用户在URL中按类型注销。
您可以定义它,如果获取请求它将重定向或呈现通知(如stackoverflow注销)
或者不要使用match 'users/sign_out' => "devise/sessions#destroy"
标记进行退出,请使用带有表单的link_to
标记(例如facebook退出),这样用户就无法输入网址{{3 }
答案 3 :(得分:4)
将此添加到application.js
:
//= require jquery_ujs
答案 4 :(得分:2)
我不知道是什么原因(我是ruby on rails的新手),但是一旦你将这一行添加到应用程序布局中,你的问题就会得到解决,
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
并保持注销链接如下
<%= link_to "Sign Out", destroy_user_session_path, :method => :delete %>
答案 5 :(得分:1)
试试这个
在路线
devise_scope :user do
get '/users/sign_out' => 'sessions#destroy'
end
答案 6 :(得分:1)
devise_scope :user do
match '/users/sign_out' => 'sessions#destroy', via: [:get, :delete]
end
答案 7 :(得分:0)
我在我的routes.rb中添加了ActiveAdmin::Devise.config
。全线是,
devise_for :users, ActiveAdmin::Devise.config
它实际上在gem's generator,所以我相信它应该在那里,但我注意到它在我的一些安装中没有添加。