Rails 设计错误 "No route matches [GET] " /users/sign_out " "



只有在手动将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",它不存在,因为你只有通过DELETEroutes.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来注销。

  1. 您可以定义它,如果得到请求,它将重定向或呈现通知(如stackoverflow注销)

  2. 或者不使用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的生成器中,所以我相信它应该在那里,但我注意到它没有添加到我的一些安装中。

最新更新