![](/img/trans.png)
[英]DEVISE - No route matches [GET] “/users/sign_out” - Rails 4
[英]Rails Devise Error “No route matches [GET] ”/users/sign_out“”
當我手動將URL輸入瀏覽器時,我只會收到此錯誤。 如果我點擊我網站上的“退出”鏈接,它會將用戶記錄正常。 這是我的“退出”鏈接:
<%= link_to "Sign out", destroy_user_session_path, method: :delete %>
哪作得很完美。 如果用戶在地址欄中鍵入地址,如何才能使注銷功能正常工作? 我知道它與GET和DELETE請求有關。 它正在使用鏈接的DELETE請求,但在手動輸入URL時使用GET請求。 我怎樣才能解決這個問題?
添加;
devise_scope :user do get '/users/sign_out' => 'devise/sessions#destroy' end
路線修復了我的問題。
將devise.rb
修改為
config.sign_out_via = :get
並改變鏈接
<%= link_to "log out", destroy_user_session_path, method: :get %>
基本上,當您嘗試手動鍵入url或嘗試使用新選項卡單擊鏈接“注銷”時,會出現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
並在routes.rb
上更改DELETE
到MATCH
請求
例如: match 'users/sign_out' => "devise/sessions#destroy"
供參考: 設計用戶管理和身份驗證。
說實話,假設更改默認的'刪除'HTTP方法,建議不要這樣做。 用戶進行測試(例如使用黃瓜) 黃瓜測試用於“退出”
Jose Valim解釋了原因:“GET請求不應該改變服務器的狀態。 當注銷是GET請求時,可以使用CSRF自動注銷,並且預先加載鏈接的內容最終也會錯誤地將您注銷。“
@manoj mona說'我們不能讓用戶通過輸入網址退出。 這是一個不好的做法'
因此,如果用戶通過URL中的類型注銷。
您可以定義它,如果獲取請求它將重定向或呈現通知(如stackoverflow注銷)
或者不要使用link_to
標簽進行注銷,使用帶有表單的input
標簽(如facebook登出),這樣用戶就無法輸入URL看到這個答案
將其添加到application.js
:
//= require jquery_ujs
我不知道是什么原因(我是ruby on rails的新手),但是一旦你將這一行添加到應用程序布局中,你的問題就會得到解決,
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
並保持注銷鏈接如下
<%= link_to "Sign Out", destroy_user_session_path, :method => :delete %>
試試這個
在路線
devise_scope :user do
get '/users/sign_out' => 'sessions#destroy'
end
devise_scope :user do
match '/users/sign_out' => 'sessions#destroy', via: [:get, :delete]
end
我將ActiveAdmin::Devise.config
添加到我的routes.rb中。 全線是,
devise_for :users, ActiveAdmin::Devise.config
它實際上是在gem的生成器中,所以我相信它應該在那里,但我注意到它在我的一些安裝中沒有添加。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.