没有路线匹配“/ users / sign_out”devise轨道3
我在我的应用程序上安装了devise,并在我的application.html.erb
文件中应用了以下内容:
<div id="user_nav"> <% if user_signed_in? %> Signed in as <%= current_user.email %>. This cannot be cheese? <%= link_to 'Sign out', destroy_user_session_path %> <% else %> <%= link_to 'Register', new_user_registration_path %> or <%= link_to 'Sign in', new_user_session_path %> <% end %> </div>
我跑rake routes
并确认所有的路线是有效的。
另外,在我的routes.rb
文件中,我有devise_for :users
和root :to => "home#index"
。
单击“注销”链接时,出现以下路由错误:
No route matches "/users/sign_out"
任何想法是什么导致了错误?
我认为退出的路线是一个DELETE
方法。 这意味着您的退出链接需要如下所示:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
你的不包括:method => :delete
部分。 另外请注意,为了实现这个function,您还必须在布局文件( application.html.erb
)中包含<%= javascript_include_tag :defaults %>
。
我在devise.rb中改了这行:
config.sign_out_via = :delete
至
config.sign_out_via = :get
它开始为我工作。
您可能没有包含jquery_ujs JavaScript文件。 确保你使用的是最新版本的jquery-ujs: https : //github.com/rails/jquery-ujs和最后一个可用的文件:
rails generate jquery:install
你不应该有更多的rails.js文件。 如果你这样做,你可能已经过时了。 确保这个文件在config / application.rb中加载了默认值
config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs)
(再次,你不应该在这里有rails.js文件)。 最后,添加如Devise wiki (haml-style)中logging的链接:
= link_to('Logout', destroy_user_session_path, :method => 'delete')
一切都会好的。
通过使用rails code = link_to('Logout', destroy_user_session_path, :method => :delete)
可以使Logout链接成为DELETE RESTful调用的html属性data-method = "delete"
。
但是,如果您没有安装gem jquery-ujs
或者没有在您的application.html via = javascript_include_tag "application"
调用生成的javascript,则响应将作为GET请求发送,并且路由将失败。
如果你不想使用jquery-ujs
或者找不到使其工作的方法,你有几个选项:
- 将
config.sign_out_via
更改为等于:get
在devise.rb
:get
(不推荐,因为DELETE是适当的REST式查询) - 或者将
link_to
改为= button_to('Logout', destroy_user_session_path, :method => :delete)
。 使用button_to
Rails将会对进行正确的DELETE调用做很多事情。 如果你愿意的话,你可以将buttondevise成一个链接。
尝试添加一个新的路线devise/会议#销毁和链接到。 例如:
routes.rb devise_for :users do get 'logout' => 'devise/sessions#destroy' end
视图:
<%= link_to "Logout", logout_path %>
在您的routes.rb文件中使用它:
devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end
我有与轨道3.1.0相同的问题,我解决了在文件中添加以下几行:
app/assets/javascripts/application.js //= require_tree //= require jquery //= require jquery_ujs
有一个例外,杰西的答案为我工作:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
更改:
:delete
… 至:
'delete'
所以对我来说工作的代码是:
<%= link_to "Sign out", destroy_user_session_path, :method => 'delete' %>
这个问题已经有很多答案了。 对我来说,问题有两个方面:
-
当我展开我的路线时:
devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end
-
我得到警告,这是贬值,所以我已经取代它:
devise_scope :users do get '/users/sign_out' => 'devise/sessions#destroy' end
-
我以为我会删除我的jQuery。 不好的select。 Devise正在使用jQuery来“伪造”DELETE请求并将其作为GET发送。 所以你需要:
//= require jquery //= require jquery_ujs
-
当然也和之前提到的一样:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
加:
<%= csrf_meta_tag %> and <%= javascript_include_tag :defaults %> to layouts
使用这些link_to标签
link_to 'Sign out', destroy_user_session_path, :method => :delete or link_to 'Sign out', '/users/sign_out', :method => :delete
在路线中添加:
devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end
其他选项是将注销configuration为GET而不是DELETE,可以在/config/initializers/devise.rb
中添加以下行
config.sign_out_via = :get
但正如Steve Klabnik在他的博客上所写的( )尝试使用DELETE,因为这种方法的语义。
如果您使用Rails 3.1,请确保您的application.html.erb注销如下所示:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
而你的JavaScript包括线看起来像下面
<%= javascript_include_tag 'application' %>
我的猜测是,一些gem覆盖default.js位置的新结构。
用github中的源代码检查它:
https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb (date:2011年6月27日)
- #用于注销资源的默认HTTP方法。 默认是:get。 188
- #config.sign_out_via =:得到187
- #用于注销资源的默认HTTP方法。 默认是:删除。 188
- :config.sign_out_via =:删除
那么,对我来说,只是删除:方法=>:删除
<%= link_to('Sign out', destroy_user_session_path) %>
这意味着在安装了jquery-rails gem后,你还没有生成jquery文件。 所以首先你需要生成它。
rails generate devise:install
第一个选项:
这意味着您必须更改/config/initializers/devise.rb
上的以下行
config.sign_out_via =:删除到config.sign_out_via =:get
第二个选项:
您只需将视图文件中的<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
<%= link_to "Sign out", destroy_user_session_path %>
更改为<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
。
通常:method => :delete
不是默认写入的。
我想补充一点,即使有点旧了。
尽pipe有:method =>:delete,但是“sign_out”链接不起作用。
必须包含指示<%= javascript_include_tag :defaults %>
的注释提醒我最近添加了JQuery java脚本,并使用简单的<script src=""/>
标记来包含它们。
当我将它们从:defaults移到之前时,sign_out再次开始工作。
希望这有助于某人。
不要忘记在application.js中包含以下行(Rails 3)
//= require_self //= require jquery //= require jquery_ujs
将jquery_ujs
包含到我的rails应用程序中,现在就可以工作了。
大多数答案是部分的。 我已经打了很多次这个问题。 有两件事情需要解决:
<%= link_to(t('logout'), destroy_user_session_path, :method => :delete) %>
需要指定删除方法
然后devise使用jQuery,所以你需要加载这些
<%= javascript_include_tag "myDirectiveJSfile" %>
并确保在myDirectiveJSfile.js中指定了jQuery和jquery-ujs
//= require jquery //= require jquery_ujs
如果您在devise中使用HTTPS,如果您的注销链接指向非安全版本,则会中断。 在后端,它redirect到安全版本。 该redirect是一个GET,这导致了问题。
确保您的链接使用HTTPS。 你可以在你的url助手中使用protocol: "https"
(确保你使用了url helper而不是path助手)。
<%= link_to "Sign out", destroy_user_session_url(protocol: "https"), method: :delete %>
在您的routes.rb中:
devise_for :users do get '/sign_out' => 'devise/sessions#destroy' get '/log_in' => 'devise/sessions#new' get '/log_out' => 'devise/sessions#destroy' get '/sign_up' => 'devise/registrations#new' get '/edit_profile' => 'devise/registrations#edit' end
并在你的application.html.erb中:
<%if user_signed_in?%> <li><%= link_to "Sign_out", sign_out_path %></li> <% end %>
这就是我所做的(使用Rails 3.0和Devise 1.4.2):
- 确保你的页面加载rails.js
- 使用这个参数:'data-method'=>'delete'
- 好主意添加此参数::rel =>'nofollow'
':method => :delete
''在页面中是' data-method="delete"
'所以你的页面必须有jquery_ujs.js,它会提交链接与方法删除不是方法get
问题始于rails 3.1 … in /app/assets/javascript/
只是寻找application.js。
如果该文件不存在创build一个名称的文件我不知道为什么我的文件消失或从来没有创build"rails new app"...
该文件是jquery...
的实例jquery...
有很多解决scheme。 但大多使用这个,
<%= link_to 'Sign out', destroy_user_session_path, method: :delete %>
或用适当的sign_out方法configurationdevise.rb
在devise.rb
config.sign_out_via = :delete ( or :get which u like to use.)
使用:get
和:delete
您的path的方法:
devise_scope :user do match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete] end
看看你的routes.rb在“devise_for:users”之前是否有“resource:users”,然后尝试交换它们:
-
作品
- devise_for:用户
- 资源:用户
-
失败
- 资源:用户
- devise_for:用户
一般情况下,当你得到“没有路由匹配”,但你认为你已经定义了这个路由,然后仔细检查该http路由的http动词/请求方法(无论是get,put,post,delete等) 。
如果你运行耙路线,那么你会看到预期的方法,你可以将它与请求日志进行比较。
devise_for :users devise_scope :user do get '/users/sign_out' => 'devise/sessions#destroy' end
我知道这是一个基于Rails 3的老问题,但我碰到并解决了Rails 4.0.4。 因此,我想我会介绍如何解决这个版本遇到这个问题的人。 你的里程可能会有所不同,但这是对我有用。
首先确保你已经安装了gem并运行bundle安装。
gem 'jquery-rails' gem 'turbolinks' gem 'jquery-turbolinks'
在application.js检查一切都是如下所需。
当心这个问题 : //= require jquery.turbolinks
而不是//= require jquery-turbolinks
//= require jquery //= require jquery_ujs //= require jquery.turbolinks //= require turbolinks //= require_tree .
接下来,在application.html.erb头部添加适当的链接。
<%= javascript_include_tag "application", "data-turbolinks-track" => true %> <%= javascript_include_tag :defaults %>
似乎有很多变化,如何实现删除方法,我认为取决于您正在使用的Rails的版本。 这是我使用的delete
语法。
<p><%= link_to "Sign Out", destroy_user_session_path, :method => 'delete' %></p>
希望能帮助挖掘出这个非常令人沮丧的洞!