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

时间:2014-01-10 09:13:09

标签: ruby-on-rails devise

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

<%= link_to "Sign out", destroy_user_session_path, method: :delete %>

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

8 个答案:

答案 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中按类型注销。

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

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