簡體   English   中英

設計/Rails:沒有路由匹配 [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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM