簡體   English   中英

Rails設計錯誤“沒有路由匹配[GET]”/ users / sign_out“”

[英]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上更改DELETEMATCH請求

例如: match 'users/sign_out' => "devise/sessions#destroy"

供參考: 設計用戶管理和身份驗證。

說實話,假設更改默認的'刪除'HTTP方法,建議不要這樣做。 用戶進行測試(例如使用黃瓜) 黃瓜測試用於“退出”

Jose Valim解釋了原因:“GET請求不應該改變服務器的狀態。 當注銷是GET請求時,可以使用CSRF自動注銷,並且預先加載鏈接的內容最終也會錯誤地將您注銷。“

@manoj mona說'我們不能讓用戶通過輸入網址退出。 這是一個不好的做法'

因此,如果用戶通過URL中的類型注銷。

  1. 您可以定義它,如果獲取請求它將重定向或呈現通知(如stackoverflow注銷)

  2. 或者不要使用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.

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