簡體   English   中英

沒有路線匹配“/users/sign_out” devise rails 3

[英]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:usersroot: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或找不到使其工作的方法,您有幾個選擇:

  1. config.sign_out_via更改為 equal :get devise.rb (不推薦,因為 DELETE 是適當的 RESTful 查詢)
  2. 或將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' %>

這個問題已經有很多答案了。 對我來說,問題有兩個方面:

  1. 當我擴展我的路線時:

     devise_for:users do get '/users/sign_out' => 'devise/sessions#destroy' end
  2. 我收到警告說這是折舊的,所以我將其替換為:

     devise_scope:users do get '/users/sign_out' => 'devise/sessions#destroy' end
  3. 我想我會刪除我的 jQuery。 糟糕的選擇。 Devise 正在使用 jQuery 來“偽造”刪除請求並將其作為 GET 發送。 因此,您需要:

     //= require jquery //= require jquery_ujs
  4. 當然還有與前面提到的許多相同的鏈接:

     <%= 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日)

  • # 用於注銷資源的默認 HTTP 方法。 默認為:獲取。 188
  • # config.sign_out_via =:get 187
  • # 用於注銷資源的默認 HTTP 方法。 默認為:刪除。 188
  • config.sign_out_via =:刪除

好吧,對我來說,伙計們只是刪除:方法=>:刪除

<%= 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):

  1. 確保您的頁面加載 rails.js
  2. 使用這個參數:'data-method' => 'delete'
  3. 添加此參數的好主意: :rel => 'nofollow'

查看您的 routes.rb 在“devise_for:users”之前是否有“resource:users”,然后嘗試交換它們:

  1. 作品

    • 設計:用戶
    • 資源:用戶
  2. 失敗

    • 資源:用戶
    • 設計:用戶

頁面中的':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.

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