これが私の実際のエラーです: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
同様の問題がありましたが、:method =>:deleteを追加しても機能しませんでした。 devise_for:usersをコメントアウトして追加することで、getリクエストの新しいルートを追加できました
devise_for :users do
get '/users/sign_out' => 'devise/sessions#destroy'
end
イニシャライザのデバイス構成を変更することで、getを介してセッションを終了できます。
# The default HTTP method used to sign out a resource. Default is :delete.
config.sign_out_via = :get
リンクを開くだけで、セッションが削除されます。
原因はわかりませんが、そのメッセージが表示されるのは、ルートに
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
私は追加する必要がありました
//= require jquery
//= require jquery_ujs
わたしの application.js
同様の問題がありました。私のビューコードは次のとおりでした:
<%= 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
私のコードでは: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を更新することをお勧めします。
Devise.rbで、
config.sign_out_via = :delete
に
config.sign_out_via = :get
これでうまくいきました。デフォルトがdelete
であり、理由がわからないので、私はこれに夢中になりました。
これは機能しますが、アプリケーションの他の要素に影響するかどうかはわかりません。
= link_to "Sign out", destroy_user_session_path,:method => :delete
[〜#〜] not [〜#〜]代わりにこれを使用します、
= link_to "Sign out", destroy_user_session_path,:method => 'delete'
トリックを実行するか、最悪のケースを追加する必要がありますjquery_ujsapplication.js
Rails4を使用して、私は次の方法を使わなければなりませんでした:
<%= link_to "Logout", destroy_admin_session_path, method: :delete %>
コロンがメソッドのどこにあるかを強調:and:delete
多分それは誰かを助けるでしょう。 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にありました。
アセット/ 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 %>
を編集します
それは私のために働いた:)
@creamhostは言う、
devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end
しかし、それは私にとって正しい解決策ではありません(Rails4)。私は問題を解決しました(@Olivesの答え)、
link_to :logout, destroy_member_session_path, method: :delete
問題はRails 3.1 in assets/javascript/
で始まります。application.js
を探してください。ファイルが存在しない場合は、その名前のファイルを作成してください。 Rails新しいアプリ...でファイルが表示されない、または作成されなかった理由を知っています...そのファイルはjqueryのインスタンスです。
FWIW私もこの問題に遭遇しました。提案されたすべての回答を調べましたが、機能したのは、open routes.rbをfotoして次の行をコメント化することだけでした。
devise_for :users
その下に、次の行を追加します。
devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end
サインアウトリンクには次を使用してください。
<%= link_to "Sign out", destroy_user_session_path, method: :delete %>
//= require jquery_ujs
アセットにこの行がありません。 /users/signout
リクエストを取得する必要はありません。この行をページの最上部のJavaScriptファイルに挿入します。
同じ問題があり、Javascriptファイルを「クリーンアップ」することを決定した後にのみ発生し始めたことを思い出しました。だから私はRails generate jquery:install --ui
再び、これで解決しました。 (JQuery UIが必要ない場合は--uiの部分は無視できます)。