web-dev-qa-db-ja.com

"/ 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"

エラーの原因は何ですか?

383
vich

サインアウトのルートはDELETEメソッドだと思います。これは、あなたのログアウトリンクは次のようになっている必要があることを意味します。

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

あなたの:method => :delete部分は含まれていません。また、これを機能させるには、レイアウトファイル(<%= javascript_include_tag :defaults %>)にapplication.html.erbも含める必要があります。

562
Jessie Dedecker

Devise.rbでこの行を変更しました。

config.sign_out_via = :delete

config.sign_out_via = :get

そしてそれは私のために働き始めました。

131
kitdesai

あなたはおそらくjquery_ujs javascriptファイルを含まなかったでしょう。最新バージョンのjquery-ujsを使用していることを確認してください。 https://github.com/Rails/jquery-ujs および使用可能な最後のファイル:

Rails generate jquery:install

notこれ以上Rails.jsファイルがあるはずです。もしそうなら、あなたはおそらく時代遅れです。このファイルもデフォルトでロードされていることを確認してください(config/application.rb)。

config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs)

(ここでも、Rails.jsファイルはnotにしてください)。最後に、 Devise wiki (haml-style)に記載されているようにリンクを追加します。

= link_to('Logout', destroy_user_session_path, :method => 'delete')

そして、すべてがうまくいくでしょう。

60
Gravis

LogoutリンクをDELETE RESTful呼び出しにする機能には、Railsコード= link_to('Logout', destroy_user_session_path, :method => :delete)を使用したhtml属性data-method = "delete"が必要です。

ただし、gem jquery-ujsがインストールされていない場合、または= javascript_include_tag "application"を介してapplication.htmlで生成されたjavascriptを呼び出さない場合、応答はGET要求として送信され、ルートは失敗します。

jquery-ujsを使用したくない場合や、機能させる方法が見つからない場合は、いくつかの選択肢があります。

  1. config.sign_out_via内で:getdevise.rbと等しくなるように変更します(DELETEが適切なRESTfulクエリであるため推奨されません)。
  2. またはlink_to= button_to('Logout', destroy_user_session_path, :method => :delete)に変更します。 button_toを使用すると、Railsは適切なDELETE呼び出しを行うことに重点を置きます。あなたが望むなら、あなたはそれからリンクのように見えるようにボタンをスタイルすることができます。
31
Will Nathan

新しいルートをdevise/sessions#destroyに追加してリンクしてみてください。例えば:

routes.rb
devise_for :users do
  get 'logout' => 'devise/sessions#destroy'
end

ビュー:

<%= link_to "Logout", logout_path %>
24
Kevin Tsoi

私はRails 3.1.0でも同じ問題を抱えていて、ファイルに以下の行を追加することで解決しました。

app/assets/javascripts/application.js
//= require_tree
//= require jquery
//= require jquery_ujs
13
gringo

Routes.rbファイルで使用してください。

devise_for :users do
    get '/users/sign_out' => 'devise/sessions#destroy'
end
13

1つの例外を除いて、ジェシーの答えは私のために働きました:

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

変化する:

:delete

... to:

'delete'

だから私のために働いたコードは:

<%= link_to "Sign out", destroy_user_session_path, :method => 'delete' %>
10
Galen

すでに多くの質問に答えています。私にとっては、問題は2つありました。

  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を削除すると思いました。下手な選択。工夫はjQueryを使用してDELETE要求を「偽造」し、GETとして送信します。したがって、あなたはする必要があります:

    //= require jquery
    //= require jquery_ujs
    
  4. そしてもちろん多くの人が以前に言及したのと同じリンク:

    <%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
    
9
Lukasz Muzyka

追加:

  <%= 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
7
Amal Kumar S

他のオプションは、ログアウトをDELETEではなくGETに設定することです。/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を使用してみてください。

7
Rodrigo Flores

Rails 3.1を使用している場合は、application.html.erbサインアウトが次のようになっていることを確認してください。

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

そして、あなたのjavascriptインクルード行は以下のようになります。

<%= javascript_include_tag 'application' %>

私の推測では、いくつかのgemがdefault.jsの場所の新しい構造を上書きします。

6
StlTenny

まあ、私のためのそれはそれを削除しただけだった:method =>:delete

<%= link_to('Sign out', destroy_user_session_path) %>
5
workdreamer

少し古くても、これに加えたいと思います。

:method =>:deleteがあっても、 "sign_out"リンクは機能しませんでした。

<%= javascript_include_tag :defaults %>を含める必要があることを示すコメントは、私が最近JQuery Javaスクリプトを追加し、それらを含めるために単純な<script src=""/>タグを使用したことを思い出させました。

それらを:デフォルトの後から前に移動したとき、sign_outは再び働き始めました。

うまくいけば、これは誰かに役立ちます。

5
Greg

Application.jsに次の行を含めることを忘れないでください(Rails 3)

//= require_self
//= require jquery
//= require jquery_ujs

私のRailsアプリケーションにjquery_ujsを含めてください。

5
The Lazy Log

これは、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はデフォルトでは書かれていません。

5

ほとんどの答えは部分的です。私は何度もこの問題にぶつかった。 2つのことに対処する必要があります。

<%= link_to(t('logout'), destroy_user_session_path, :method => :delete) %>

deleteメソッドを指定する必要があります

次に工夫してjqueryを使うので、それらをロードする必要があります。

   <%= javascript_include_tag "myDirectiveJSfile" %> 

そして、myDirectiveJSfile.jsにjqueryとjquery-ujsの両方が指定されていることを確認してください。

//= require jquery
//= require jquery_ujs
5
Jerome

Githubのソースコードでそれをチェックしてください。

https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb (2011年6月27日)

  • #リソースのサインアウトに使用されるデフォルトのHTTPメソッド。デフォルトはgetです。 188
  • #config.sign_out_via =:187を取得
  • #リソースのサインアウトに使用されるデフォルトのHTTPメソッド。デフォルトはdeleteです。 188
  • config.sign_out_via =:削除
5
Shane

HTTPSを使用 を使用している場合、サインアウトリンクがセキュリティで保護されていないバージョンへのリンクである場合は無効になります。バックエンドで、それは安全なバージョンにリダイレクトします。そのリダイレクトはGETであり、それが問題を引き起こします。

リンクがHTTPSを使用していることを確認してください。 URLヘルパーのprotocol: "https"でそれを強制することができます(パスヘルパーではなくURLヘルパーを使うようにしてください)。

<%= link_to "Sign out", destroy_user_session_url(protocol: "https"), method: :delete %>
4
Tyler Collier
  devise_for :users
  devise_scope :user do
    get '/users/sign_out' => 'devise/sessions#destroy'
  end
4
dipole_moment

たくさんの解決策があります。しかし、ほとんどこれを使います、

<%= link_to 'Sign out', destroy_user_session_path, method: :delete %>

または適切なsign_outメソッドを使用してdevise.rbを設定する

In devise.rb

config.sign_out_via = :delete ( or  :get which u like to use.) 
3
jon snow

パスに:getおよび:deleteメソッドを使用してください。

devise_scope :user do
  match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete]
end
3
Zakaria

問題はRails 3.1から始まります... /app/assets/javascript/でapplication.jsを探すだけです。

ファイルが存在しない場合、その名前のファイルを作成します。私のファイルが表示されなくなった、または"Rails new app"...に作成されなかった理由はわかりません。

そのファイルはjquery...のインスタンスです。

3
rome3ro

これは私がしたことです(Rails 3.0とDevise 1.4.2):

  1. ページにRails.jsがロードされていることを確認してください。
  2. このパラメーターを使用してください: 'data-method' => 'delete'
  3. このパラメータを追加することをお勧めします。:rel => 'nofollow'
2
Larry

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 %>

あなたのroutes.rbが "devise_for:users"の前に "resource:users"を持っているか確認してからそれらを交換してみてください:

  1. 作品

    • devise_for:ユーザー
    • リソース:ユーザー
  2. 失敗する

    • リソース:ユーザー
    • devise_for:ユーザー
1
Charles Magid

私はこれがRails 3に基づく古い質問であることを知っていますが、私はRails 4.0.4でそれを見つけて解決しました。そのため、このバージョンでこの問題が発生した場合に備えて、どのように修正すればよいかを考えてみました。あなたの走行距離は変わるかもしれませんが、これは私のために働いたものです。

最初にgemがインストールされていることを確認し、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のヘッダーに適切なリンクを追加します。

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

この非常にイライラする穴から誰かを掘るのに役立ちます願っています!

1
mikeym

ページ内の':method => :deleteは 'data-method="delete"'なので、あなたのページはjquery_ujs.jsを持っていなければなりません、それはmethod getではなくmethod deleteでリンクを送信するでしょう

1
user1599712

一般的に、 "No route matches"と表示されますが、そのルートはそのとき定義されていると思いますそのルートのhttp動詞/要求メソッド(get、put、post、deleteなど)を再確認してください

あなたが熊手ルートを走らせるなら、あなたは期待された方法を見るでしょう、そしてあなたはこれをリクエストログと比較することができます。

0
Muntasim