web-dev-qa-db-ja.com

一致するルートはありません[GET] "/ users / sign_out"

これが私の実際のエラーです:No route matches [GET] "/members/sign_out"ほとんどの人は「ユーザー」を使用するので、タイトルにそれを含めるとより役立つと思いました。とにかく、私はログアウトできないことが不可欠です。メンバープロフィールを編集できました。

私はdevise 1.4.2とRails 3.1.0.rc4を使用しています。また、「members」と「admins」と呼ばれる2つの別個のdeviseモデルを生成しました。正しいURLパス(つまり、localhost:3000/admins/sign_in /)に手動で移動して、両方を(同時に)登録してログインするには、次のようにしてapplication.html.hamlレイアウトファイル内にリンクを作成します- RailsCast on Devise 。「メンバー」のサインイン/サインアウトリンクのみに対応していることを承知しています。

サインアウトリンクをクリックすると、上記のエラーが発生します。これは、どちらかのサインアウトURL(つまり、localhost:3000/admins/sign_out /)に手動で移動した場合に発生します。

なぜこれが起こっているのか誰かに教えてもらえますか?以下は、さまざまな関連ファイルです。そしてもちろん、私は初心者です...

レーキルート出力:

    j(film_repo)$ rake routes
        new_member_session GET    /members/sign_in(.:format)       {:action=>"new", :controller=>"devise/sessions"}
            member_session POST   /members/sign_in(.:format)       {:action=>"create", :controller=>"devise/sessions"}
    destroy_member_session DELETE /members/sign_out(.:format)      {:action=>"destroy", :controller=>"devise/sessions"}
           member_password POST   /members/password(.:format)      {:action=>"create", :controller=>"devise/passwords"}
       new_member_password GET    /members/password/new(.:format)  {:action=>"new", :controller=>"devise/passwords"}
      edit_member_password GET    /members/password/edit(.:format) {:action=>"edit", :controller=>"devise/passwords"}
                           PUT    /members/password(.:format)      {:action=>"update", :controller=>"devise/passwords"}
cancel_member_registration GET    /members/cancel(.:format)        {:action=>"cancel", :controller=>"devise/registrations"}
       member_registration POST   /members(.:format)               {:action=>"create", :controller=>"devise/registrations"}
   new_member_registration GET    /members/sign_up(.:format)       {:action=>"new", :controller=>"devise/registrations"}
  edit_member_registration GET    /members/edit(.:format)          {:action=>"edit", :controller=>"devise/registrations"}
                           PUT    /members(.:format)               {:action=>"update", :controller=>"devise/registrations"}
                           DELETE /members(.:format)               {:action=>"destroy", :controller=>"devise/registrations"}
         new_admin_session GET    /admins/sign_in(.:format)        {:action=>"new", :controller=>"devise/sessions"}
             admin_session POST   /admins/sign_in(.:format)        {:action=>"create", :controller=>"devise/sessions"}
     destroy_admin_session DELETE /admins/sign_out(.:format)       {:action=>"destroy", :controller=>"devise/sessions"}
            admin_password POST   /admins/password(.:format)       {:action=>"create", :controller=>"devise/passwords"}
        new_admin_password GET    /admins/password/new(.:format)   {:action=>"new", :controller=>"devise/passwords"}
       edit_admin_password GET    /admins/password/edit(.:format)  {:action=>"edit", :controller=>"devise/passwords"}
                           PUT    /admins/password(.:format)       {:action=>"update", :controller=>"devise/passwords"}
 cancel_admin_registration GET    /admins/cancel(.:format)         {:action=>"cancel", :controller=>"devise/registrations"}
        admin_registration POST   /admins(.:format)                {:action=>"create", :controller=>"devise/registrations"}
    new_admin_registration GET    /admins/sign_up(.:format)        {:action=>"new", :controller=>"devise/registrations"}
   edit_admin_registration GET    /admins/edit(.:format)           {:action=>"edit", :controller=>"devise/registrations"}
                           PUT    /admins(.:format)                {:action=>"update", :controller=>"devise/registrations"}
                           DELETE /admins(.:format)                {:action=>"destroy", :controller=>"devise/registrations"}
                     films GET    /films(.:format)                 {:action=>"index", :controller=>"films"}
                           POST   /films(.:format)                 {:action=>"create", :controller=>"films"}
                  new_film GET    /films/new(.:format)             {:action=>"new", :controller=>"films"}
                 edit_film GET    /films/:id/edit(.:format)        {:action=>"edit", :controller=>"films"}
                      film GET    /films/:id(.:format)             {:action=>"show", :controller=>"films"}
                           PUT    /films/:id(.:format)             {:action=>"update", :controller=>"films"}
                           DELETE /films/:id(.:format)             {:action=>"destroy", :controller=>"films"}
                      root        /                                {:controller=>"films", :action=>"index"}

routes.rb

FilmRepo::Application.routes.draw do
  devise_for :members

  devise_for :admins

  resources :films

  root :to => 'films#index'
end

admin.rb(モデル)

class Admin < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, and :omniauthable
  devise :database_authenticatable, :registerable, :timeoutable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me
end

member.rb(モデル)

class Member < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me
end

application.html.haml

!!!
%html
    %head
        %title Film Repo
        = stylesheet_link_tag 'compiled/screen.css', :media => 'screen, projection'
        = stylesheet_link_tag 'compiled/print.css', :media => 'print'
        /[if lt IE 8]
            = stylesheet_link_tag 'compiled/ie.css', :media => 'screen, projection'
            = csrf_meta_tag
    %body.bp
        #container
            #user_nav
                - if member_signed_in?
                    Signed in as #{current_member.email}. Not you?
                    \#{link_to "Sign out", destroy_member_session_path}
                - else
                    = link_to "Sign up", new_member_registration_path
                    or #{link_to "sign in", new_member_session_path}
                - flash.each do |name, msg|
                    = content_tag :div, msg, :id => "flash_#{name}"
            = yield
26
Joe

同様の問題がありましたが、:method =>:deleteを追加しても機能しませんでした。 devise_for:usersをコメントアウトして追加することで、getリクエストの新しいルートを追加できました

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

イニシャライザのデバイス構成を変更することで、getを介してセッションを終了できます。

# The default HTTP method used to sign out a resource. Default is :delete.
config.sign_out_via = :get

リンクを開くだけで、セッションが削除されます。

45
itkevin

原因はわかりませんが、そのメッセージが表示されるのは、ルートに

destroy_member_session DELETE /members/sign_out(.:format)      {:action=>"destroy", :controller=>"devise/sessions"}

つまり、GETではなくDELETEメソッドでのみルートを使用できます。 deviseのドキュメントではGETルート(https://github.com/plataformatec/devise/blob/master/lib/devise/Rails/routes.rb#L30)として作成する必要があると記載されているため、これは少し奇妙です

DELETEルートとして使用すると、次を使用してログアウトできるはずです

link_to :logout, destroy_member_session_path, :method => :delete 
21
Olives

私は追加する必要がありました

//= require jquery
//= require jquery_ujs

わたしの application.js

18
Victor Martins

同様の問題がありました。私のビューコードは次のとおりでした:

  <%= link_to " exit", destroy_user_session_path, method: :delete %>

次の変更をroutes.rbに追加した後、機能しました、

devise_for :users

devise_scope :user do  
   get '/users/sign_out' => 'devise/sessions#destroy'     
end
17
Reza

私のコードでは:method => :deleteを引き続き使用できます。

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

Jqueryを含むjavascriptの読み込みに失敗したと思う理由、確認してください

= javascript_include_tag "application" (haml- you can use html too)

jquery-uiとjquery-ujsを含めます。それでもエラーが発生する場合は、GEMFILEのRails gemをバージョン3.2.6に変更し、bundle updateを呼び出してgemを更新することをお勧めします。

6
duykhoa

Devise.rbで、

 config.sign_out_via = :delete

config.sign_out_via = :get

これでうまくいきました。デフォルトがdeleteであり、理由がわからないので、私はこれに夢中になりました。

これは機能しますが、アプリケーションの他の要素に影響するかどうかはわかりません。

5
loloso
= link_to "Sign out", destroy_user_session_path,:method => :delete

[〜#〜] not [〜#〜]代わりにこれを使用します、

= link_to "Sign out", destroy_user_session_path,:method => 'delete'

トリックを実行するか、最悪のケースを追加する必要がありますjquery_ujsapplication.js

5
Nikhil Nanjappa

Rails4を使用して、私は次の方法を使わなければなりませんでした:

<%= link_to "Logout", destroy_admin_session_path, method: :delete %>

コロンがメソッドのどこにあるかを強調:and:delete

4
Sam

多分それは誰かを助けるでしょう。 Rails 3.0から3.1にアップグレードしたところ、この問題が見つかりました。これで修正されました:

routes.rb:
devise_for:ユーザー

devise.rb:
config.sign_out_via =:delete

application.html.erb:

<%= javascript_include_tag "application" %>     

* not:defaults

_login_items.html.erb:

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

app/assets/javascripts/application.js

//= require jquery
//= require jquery-ui
//= require jquery_ujs
//= require_tree .

そして、私は削除した3.0バージョンのjavascript/jquery.js、jquery_ujs.jsにありました。

3
Katya B

アセット/ javascripts/*を削除した可能性があります

Rails generate jquery:install --uiを実行すると、以下に示すようにすべてのJavaScriptが生成されます

xxxx@xxxxx:~/Projects/Rails_apps/rtest$ Rails generate jquery:install --ui
      remove  public/javascripts/prototype.js
      remove  public/javascripts/effects.js
      remove  public/javascripts/dragdrop.js
      remove  public/javascripts/controls.js
     copying  jQuery (1.7.1)
      create  public/javascripts/jquery.js
      create  public/javascripts/jquery.min.js
     copying  jQuery UI (1.8.16)
      create  public/javascripts/jquery-ui.js
      create  public/javascripts/jquery-ui.min.js
     copying  jQuery UJS adapter (822920)
      remove  public/javascripts/Rails.js
      create  public/javascripts/jquery_ujs.js

レイアウト(例:application.html.erb)に移動し、<%= javascript_include_tag :all %>を編集します

それは私のために働いた:)

3
Bernard Banta

@creamhostは言う、

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

しかし、それは私にとって正しい解決策ではありません(Rails4)。私は問題を解決しました(@Olivesの答え)、

link_to :logout, destroy_member_session_path, method: :delete
2
seyyah

問題はRails 3.1 in assets/javascript/で始まります。application.jsを探してください。ファイルが存在しない場合は、その名前のファイルを作成してください。 Rails新しいアプリ...でファイルが表示されない、または作成されなかった理由を知っています...そのファイルはjqueryのインスタンスです。

2
rome3ro

FWIW私もこの問題に遭遇しました。提案されたすべての回答を調べましたが、機能したのは、open routes.rbをfotoして次の行をコメント化することだけでした。

devise_for :users

その下に、次の行を追加します。

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

サインアウトリンクには次を使用してください。

<%= link_to "Sign out", destroy_user_session_path, method: :delete %>
1
phildub
//= require jquery_ujs

アセットにこの行がありません。 /users/signoutリクエストを取得する必要はありません。この行をページの最上部のJavaScriptファイルに挿入します。

1
Idrees Ibrahim

同じ問題があり、Javascriptファイルを「クリーンアップ」することを決定した後にのみ発生し始めたことを思い出しました。だから私はRails generate jquery:install --ui再び、これで解決しました。 (JQuery UIが必要ない場合は--uiの部分は無視できます)。

0
octimizer