[英]Rails Devise Error “No route matches [GET] ”/users/sign_out“”
[英]Devise/Rails: No route matches [GET] “/users/sign_out”
我對設計如何路由我的請求感到有些困惑,出於某種原因,我現在無法進入我的應用程序中的注銷路徑:
ActionController::RoutingError (No route matches [GET] "/users/sign_out")
以下是與我的 User 模型和 Devise 相關的路線:
devise_for :users, :controllers => {:registrations => "registrations"}
devise_scope :user do
get '/settings' => 'registrations#edit'
end
定義該范圍是否也會阻止我的其他路由工作?
更新
我不認為它應該是GET
請求,因為我的鏈接看起來像:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
如果您嘗試通過在瀏覽器的地址欄中輸入或正常鏈接來訪問 /users/sign_out,您將收到此錯誤。 總結這里的一些評論和答案以及 github 上設計存儲庫中的問題:
這是預期的功能,RESTful 應用程序不應使用 GET 請求修改狀態。
您可以通過創建一個使用@Trip、@fuzzyalej 和@Joseph Silvashy 提到的 DELETE 方法的鏈接來解決此問題。
或者,(不太推薦),在 /config/initializers/devise.rb 中,您可以進行以下更改
config.sign_out_via = :delete
至
config.sign_out_via = :get
我在關注http://railscasts.com/episodes/209-introducing-devise以及他在那里使用的舊版本設計時遇到了這個問題,這不是問題。
所以這篇文章有一個答案:
這必須與方法一起發送, delete
以便它不會默認為get
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
如果您將 SSL 與 Devise 控制器一起使用,並嘗試從“http”網址注銷,則發生的情況是它將 DELETE 請求發送到 #destroy 方法,然后通過 GET 重定向到 https 版本。 您可以通過將 https 添加到注銷鏈接來解決此問題,如下所示:
= link_to "Sign out", destroy_user_session_url(protocol: 'https'), method: :delete
注意:必須是 'url' 而不是 'path'
使用正確的 HTTP 方法保留您的devise.rb
:
# good
config.sign_out_via = :delete
# bad
config.sign_out_via = :get
使用button_to
而不是link_to
# good
= button_to "Sign Out", destroy_user_session_path, method: :delete
# bad
= link_to "Sign Out", destroy_user_session_path, method: :delete"
如果您正在使用引導程序(保持優雅)
= link_to "Sign Out", destroy_user_session_path, method: :delete, class: "btn btn-default btn-sm"
從Rails 文檔:
link_to("Destroy", "http://www.example.com", :method => :delete, :confirm => "Are you sure?")
# => <a href='http://www.example.com' rel="nofollow" data-method="delete" data-confirm="Are you sure?">Destroy</a>
我遇到了同樣的問題,並采取了以下步驟來解決它:1) 在 assets/javascripts/application.js 中包含 //= require jquery_ujs 2) 將 gem 'jquery-rails' 添加到我的 gemfile 3) 捆綁安裝
......它奏效了。
devise_for :users
devise_scope :user do
get '/users/sign_out' => 'devise/sessions#destroy'
end
在你的routes.rb 中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.