私は自分のアプリに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 :users
とroot :to => "home#index"
があります。
[サインアウト]リンクをクリックすると、次のようなルーティングエラーが発生します。
No route matches "/users/sign_out"
エラーの原因は何ですか?
サインアウトのルートはDELETE
メソッドだと思います。これは、あなたのログアウトリンクは次のようになっている必要があることを意味します。
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
あなたの:method => :delete
部分は含まれていません。また、これを機能させるには、レイアウトファイル(<%= javascript_include_tag :defaults %>
)にapplication.html.erb
も含める必要があります。
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
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')
そして、すべてがうまくいくでしょう。
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
を使用したくない場合や、機能させる方法が見つからない場合は、いくつかの選択肢があります。
config.sign_out_via
内で:get
をdevise.rb
と等しくなるように変更します(DELETEが適切なRESTfulクエリであるため推奨されません)。link_to
を= button_to('Logout', destroy_user_session_path, :method => :delete)
に変更します。 button_to
を使用すると、Railsは適切なDELETE呼び出しを行うことに重点を置きます。あなたが望むなら、あなたはそれからリンクのように見えるようにボタンをスタイルすることができます。新しいルートをdevise/sessions#destroyに追加してリンクしてみてください。例えば:
routes.rb
devise_for :users do
get 'logout' => 'devise/sessions#destroy'
end
ビュー:
<%= link_to "Logout", logout_path %>
私はRails 3.1.0でも同じ問題を抱えていて、ファイルに以下の行を追加することで解決しました。
app/assets/javascripts/application.js
//= require_tree
//= require jquery
//= require jquery_ujs
Routes.rbファイルで使用してください。
devise_for :users do
get '/users/sign_out' => 'devise/sessions#destroy'
end
1つの例外を除いて、ジェシーの答えは私のために働きました:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
変化する:
:delete
... to:
'delete'
だから私のために働いたコードは:
<%= link_to "Sign out", destroy_user_session_path, :method => 'delete' %>
すでに多くの質問に答えています。私にとっては、問題は2つありました。
ルートを広げると
devise_for :users do
get '/users/sign_out' => 'devise/sessions#destroy'
end
私はこれが廃止予定であるという警告を受けていたので、私はそれをそれに置き換えました:
devise_scope :users do
get '/users/sign_out' => 'devise/sessions#destroy'
end
私は自分のjQueryを削除すると思いました。下手な選択。工夫はjQueryを使用してDELETE要求を「偽造」し、GETとして送信します。したがって、あなたはする必要があります:
//= require jquery
//= require jquery_ujs
そしてもちろん多くの人が以前に言及したのと同じリンク:
<%= 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
他のオプションは、ログアウトを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を使用してみてください。
Rails 3.1を使用している場合は、application.html.erbサインアウトが次のようになっていることを確認してください。
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
そして、あなたのjavascriptインクルード行は以下のようになります。
<%= javascript_include_tag 'application' %>
私の推測では、いくつかのgemがdefault.jsの場所の新しい構造を上書きします。
まあ、私のためのそれはそれを削除しただけだった:method =>:delete
<%= link_to('Sign out', destroy_user_session_path) %>
少し古くても、これに加えたいと思います。
:method =>:deleteがあっても、 "sign_out"リンクは機能しませんでした。
<%= javascript_include_tag :defaults %>
を含める必要があることを示すコメントは、私が最近JQuery Javaスクリプトを追加し、それらを含めるために単純な<script src=""/>
タグを使用したことを思い出させました。
それらを:デフォルトの後から前に移動したとき、sign_outは再び働き始めました。
うまくいけば、これは誰かに役立ちます。
Application.jsに次の行を含めることを忘れないでください(Rails 3)
//= require_self
//= require jquery
//= require jquery_ujs
私のRailsアプリケーションにjquery_ujs
を含めてください。
これは、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
はデフォルトでは書かれていません。
ほとんどの答えは部分的です。私は何度もこの問題にぶつかった。 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
Githubのソースコードでそれをチェックしてください。
HTTPSを使用 を使用している場合、サインアウトリンクがセキュリティで保護されていないバージョンへのリンクである場合は無効になります。バックエンドで、それは安全なバージョンにリダイレクトします。そのリダイレクトは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 %>
または適切なsign_outメソッドを使用してdevise.rbを設定する
In 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
問題はRails 3.1から始まります... /app/assets/javascript/
でapplication.jsを探すだけです。
ファイルが存在しない場合、その名前のファイルを作成します。私のファイルが表示されなくなった、または"Rails new app"...
に作成されなかった理由はわかりません。
そのファイルはjquery...
のインスタンスです。
これは私がしたことです(Rails 3.0とDevise 1.4.2):
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"を持っているか確認してからそれらを交換してみてください:
作品
失敗する
私はこれが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>
この非常にイライラする穴から誰かを掘るのに役立ちます願っています!
ページ内の':method => :delete
は 'data-method="delete"
'なので、あなたのページはjquery_ujs.jsを持っていなければなりません、それはmethod getではなくmethod deleteでリンクを送信するでしょう
一般的に、 "No route matches"と表示されますが、そのルートはそのとき定義されていると思いますそのルートのhttp動詞/要求メソッド(get、put、post、deleteなど)を再確認してください 。
あなたが熊手ルートを走らせるなら、あなたは期待された方法を見るでしょう、そしてあなたはこれをリクエストログと比較することができます。