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请求.我怎样才能解决这个问题?
添加;
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)
基本上,当您尝试手动输入网址或尝试clickin链接"签退"的新标签有HTTP GET请求,你会得到No route matches [GET] "/users/sign_out",它不存在,因为你只有通过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
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中的类型注销.
您可以定义它,如果获取请求它将重定向或呈现通知(如stackoverflow注销)
或者不使用link_to标签注销,使用input标签与表格(如facebook退出),所以用户不能输入URL看到这个答案