Rails设计错误"没有路由匹配[GET]"/ users/sign_out""

the*_*ler 5 ruby-on-rails devise

当我手动将URL输入浏览器时,我只会收到此错误.如果我点击我网站上的"退出"链接,它会将用户记录正常.这是我的"退出"链接:

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

哪作得很完美.如果用户在地址栏中键入地址,如何才能使注销功能正常工作?我知道它与GET和DELETE请求有关.它正在使用链接的DELETE请求,但在手动输入URL时使用GET请求.我怎样才能解决这个问题?

Qua*_*aso 9

添加;

devise_scope :user do get '/users/sign_out' => 'devise/sessions#destroy' end

路线修复了我的问题.


小智 7

修改devise.rb

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

并改变链接

<%= link_to "log out", destroy_user_session_path, method: :get %>
Run Code Online (Sandbox Code Playgroud)

  • 我不想那样做.我知道这是一个解决方案,但这不是最好的做法.我想继续使用DELETE (5认同)

rai*_*_id 7

基本上,当您尝试手动输入网址或尝试clickin链接"签退"的新标签有HTTP GET请求,你会得到No route matches [GET] "/users/sign_out",它不存在,因为你只有通过DELETE请求/users/sign_outroutes.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
Run Code Online (Sandbox Code Playgroud)

DELETE改为MATCH要求你的routes.rb

例如: match 'users/sign_out' => "devise/sessions#destroy"

供参考:设计用户管理和身份验证.

说实话,假设更改默认的'删除'HTTP方法,建议不要这样做.用户进行测试(例如使用黄瓜) 黄瓜测试用于"退出"

Jose Valim解释了原因:"GET请求不应该改变服务器的状态.当注销是GET请求时,可以使用CSRF自动注销,并且预先加载链接的内容最终也会错误地将您注销."

@manoj mona说'我们不能让用户通过输入网址退出.这是一个不好的做法'

因此,如果用户通过URL中的类型注销.

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

  2. 或者不使用link_to标签注销,使用input标签与表格(如facebook退出),所以用户不能输入URL看到这个答案

  • 那么使用设计的每个人都必须这样做才能让它正常工作吗?似乎这个问题不应该作为默认值存在 (3认同)