![](/img/trans.png)
[英]Rails Devise Error “No route matches [GET] ”/users/sign_out“”
[英]No route matches "/users/sign_out" devise rails 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
部分。 另外,請注意,要使其正常工作,您還必須在布局文件( 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 樣式)中記錄的鏈接:
= link_to('Logout', destroy_user_session_path, :method => 'delete')
一切都會好起來的。
使注銷鏈接成為 DELETE RESTful 調用的能力需要 html 屬性data-method = "delete"
使用 rails code = link_to('Logout', destroy_user_session_path, :method =>:delete)
。
但是,如果您沒有安裝 gem jquery-ujs
或者沒有在您的 application.html via = javascript_include_tag "application"
中調用生成的 javascript ,則響應將作為 GET 請求發送,並且路由將失敗。
如果您不想使用jquery-ujs
或找不到使其工作的方法,您有幾個選擇:
config.sign_out_via
更改為 equal :get
devise.rb
(不推薦,因為 DELETE 是適當的 RESTful 查詢)link_to
更改為= button_to('Logout', destroy_user_session_path, :method =>:delete)
。 使用button_to
,Rails 將完成正確的 DELETE 調用。 然后,您可以根據需要設置按鈕的樣式,使其看起來像一個鏈接。嘗試添加一條新路由來設計/會話#destroy 並鏈接到該路由。 例如:
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
我在使用 rails 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。 糟糕的選擇。 Devise 正在使用 jQuery 來“偽造”刪除請求並將其作為 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
其他選項是將注銷配置為 GET 而不是 DELETE,您可以在/config/initializers/devise.rb
上添加以下行
config.sign_out_via = :get
但正如 Steve Klabnik 在他的博客 (http://blog.steveklabnik.com/2011/12/11/devise-actioncontroller-routingerror-no-route-matches-get-slash-users-slash-sign-out.html ) 由於此方法的語義,請嘗試使用 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 位置的新結構。
不要忘記在您的 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
查看 github 中的源代碼:
https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb (日期:2011年6月27日)
好吧,對我來說,伙計們只是刪除:方法=>:刪除
<%= link_to('Sign out', destroy_user_session_path) %>
我想補充一點,即使它有點舊了。
“sign_out”鏈接不起作用,盡管有:method =>:delete。
指示必須包含<%= javascript_include_tag:defaults %>
的注釋提醒我我最近添加了 JQuery java 腳本並使用簡單的<script src=""/>
標簽來包含它們。
當我將它們從:defaults 之后移到之前時,sign_out 再次開始工作。
希望這可以幫助某人。
這意味着您在安裝 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 %>
更改為<%= link_to "Sign out", destroy_user_session_path, :method =>:delete %>
。
通常:method =>:delete
默認不寫。
如果您將HTTPS 與 devise 一起使用,則如果您的注銷鏈接指向非安全版本,它將中斷。 在后端,它重定向到安全版本。 該重定向是一個 GET,這會導致問題。
確保您的鏈接使用 HTTPS。 您可以在 url 助手中使用protocol: "https"
(確保使用 url 助手而不是路徑助手)。
<%= link_to "Sign out", destroy_user_session_url(protocol: "https"), method: :delete %>
devise_for :users
devise_scope :user do
get '/users/sign_out' => 'devise/sessions#destroy'
end
有很多解決方案。 但大多使用這個,
<%= link_to 'Sign out', destroy_user_session_path, method: :delete %>
或使用正確的簽出方法配置 devise.rb
在 devise.rb
config.sign_out_via = :delete ( or :get which u like to use.)
為您的路徑使用:get
和:delete
方法:
devise_scope :user do
match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete]
end
問題從/app/assets/javascript/
中的 rails 3.1... 開始,只需查找 application.js。
如果該文件不存在,請創建一個具有該名稱的文件,我不知道為什么我的文件會消失或從未在"rails new app"...
該文件是jquery...
的實例。
在您的 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):
查看您的 routes.rb 在“devise_for:users”之前是否有“resource:users”,然后嘗試交換它們:
作品
失敗
頁面中的':method =>:delete
' 是 ' data-method="delete"
' 所以你的頁面必須有 jquery_ujs.js,它將使用方法 delete 而不是方法 get 提交鏈接
我知道這是一個基於 Rails 3 的老問題,但我只是在 Rails 4.0.4 上遇到並解決了它。 所以我想我會為遇到此版本問題的任何人介紹我如何修復它。 您的里程可能會有所不同,但這對我有用。
首先確保您已安裝 gems 並運行 bundle install。
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 的 header 中添加相應的鏈接。
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
<%= javascript_include_tag :defaults %>
關於如何實現 delete 方法似乎有很多變化,我認為這取決於您使用的 Rails 版本。 這是我使用的delete
語法。
<p><%= link_to "Sign Out", destroy_user_session_path, :method => 'delete' %></p>
希望這有助於將某人從這個非常令人沮喪的洞中挖出來!
通常,當您收到“無路由匹配”但您認為已定義該路由時,請仔細檢查該路由的 http 動詞/請求方法(無論是獲取、放置、發布、刪除等) 。
如果您運行 rake 路由,那么您將看到預期的方法,您可以將其與請求日志進行比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.