問題:簡単に言えば、ログアウトリンクをアプリにインストールしようとすると、機能しません。ここに私が考えることができる限り多くのコンテキストがあります(何か他のものが必要な場合は、私をつついてください)...
私はこれをhamlビューで持っています:
= link_to("Logout", destroy_user_session_path, :method => :delete)
ビューでこれを生成します:
<a href="/users/sign_out" data-method="delete" rel="nofollow">Logout</a>
Config/initializers/devise.rbで、この設定がコメント化されておらず正しいことを確認しました。
config.sign_out_via = :delete
次のルートを検証しました。
destroy_user_session DELETE /users/sign_out(.:format) {:action=>"destroy", :controller=>"devise/sessions"}
また、routes.rbにもこのちょっとした策略がありますが、これは私の問題に関連していると思われます。
devise_for :users, :controllers => {:sessions => "devise/sessions", :registrations => "users"}
resources :users
この最後のビットは、自分のコントローラーでユーザーを管理(編集、作成、削除)したいからです。
表示されるエラーメッセージは次のとおりです。
ActiveRecord::RecordNotFound in UsersController#show
Couldn't find User with ID=sign_out
Rails.root: /home/jaydel/projects/mbsquared-projects/Wilson-Goldrick
app/controllers/users_controller.rb:16:in `show'
私のサーバーログでは、リクエストについてこれを見る:
Started GET "/users/sign_out" for 127.0.0.1 at 2011-08-04 13:08:51 -0500
Processing by UsersController#show as HTML
Parameters: {"id"=>"sign_out"}
誰にもアイデアはありますか?
問題は、ログ内のサインアウトリクエストがGETリクエストであるという事実にあります。
Started GET "/users/sign_out"
ただし、サインアウトルートはDELETEです
destroy_user_session DELETE /users/sign_out(.:format)
例外が発生する理由は、resources :users
によって作成されるルートの1つと混同されるためです。
edit_user GET /users/(:id)(.:format) {:action=>"edit", :controller=>"users"}
基本的に「sign_out」はIDと間違えられています。
削除リンクがDELETEリクエストとして処理されない理由がわかりません。変わっても
config.sign_out_via = :delete
:get
にすると、問題が解決する場合があります。
これを修正する正しい方法は、RESTごとに、DELETEメソッドを使用するようにログアウトリンクを変更することです。これは非常に簡単な修正で、これを変更します:
link_to "Log out", destroy_user_session_path
これに:
link_to "Log out", destroy_user_session_path, :method => :delete
application.js
からこの行を削除したときに、Rails 3.2で同じ問題が発生しました。
//= require jquery_ujs
そのため、application.js
にこの行を挿入する必要があると思います。
PS。この動作は、Rails用アダプターjquery
が機能しないことを意味します。したがって、ブラウザのhtmlにロードされているかどうかを確認する必要があります。実稼働環境では圧縮されたjsがあり、そこで何かを見つけるのは非常に難しいため、開発モードでテストする必要があります。
両方が必要ですlink_to "Log out", destroy_user_session_path, method: :delete
&&これらはapplication.jsに含まれています
//= require jquery
//= require jquery_ujs
。明らかに、何らかの理由で存在しない場合は、これをGemfileに追加することを忘れないでください。
gem 'jquery-Rails'
dELETEを使用して要求を実行するには、jQueryが必要です。 application.jsから削除していないことを確認してください。
これは古い質問ですが、受け入れられた答えは、この問題を解決する適切な方法ではありません(ただし、問題の適切な診断です)。
今日私がこれに遭遇したとき、私のroutesファイルは次のように見えました:
root :to => 'welcome#index'
resources :users
devise_for :users
Olivesが述べたように、resourcesステートメントは/ users/anythingをトリップさせるだけです。私は単にルートの順序を逆にする必要がありました...
root :to => 'welcome#index'
devise_for :users
resources :users
私はこのすべてのソリューションをチェックしましたが、誰も私のために働いていません。最後に、ヘッダーでアプリケーションタグとcsrfメタを含む2行を削除したことがわかりました
だから、誰かがこの時点で解決なしでこの問題を抱えている場合-ページのヘッダーにあるかどうかを確認してください(HAML表記)
= javascript_include_tag 'application'
= csrf_meta_tags
これは古い質問ですが、JavaScriptを必要としない方法が必要でした。 Railsは、method
をdelete
に設定する隠し入力を持つ要求のような「DELETE」を有効にします。実際の<form>
、およびlet Rails必要な非表示入力を生成します。
<%= form_for(resource, as: resource_name,
url: destroy_user_session_path, html: { method: :delete }) do |f| %>
<%= f.submit "Log out" %>
<% end %>
上記は次のようなものを生成します:
<form accept-charset="UTF-8" action="/users/sign_out" method="post">
<div style="display:none">
<input name="utf8" type="hidden" value="✓">
<input name="_method" type="hidden" value="delete">
<input name="authenticity_token" type="hidden" value="1234">
</div>
<input name="commit" type="submit" value="Log out">
</form>
また、確認する必要があります、resources :users
下 devise_for :users
とは、リンクメソッドの削除です
link_to "Logout", destroy_user_session_path, method: :delete
両方が正しい場合、ログアウトボタンが機能するはずです
OPが工夫を述べており、この問題が私にも起こったので、私はただチャイムインしたかっただけです。jQuery_ujsを使用したくない場合は、@ Ross Allenが正しい答えを持っていました。 Railsは、jQueryなしでこれを解決するためのヘルパーを提供します。
これはロスの答えですが、Deviseのcurrent_userモデルを使用しています:
<%= form_for(current_user,
url: destroy_user_session_path, html: { method: :delete }) do |f| %>
<%= f.submit "Log out" %>
<% end %>
または、より簡潔な button_to 同様のフォームを作成するヘルパー:
<%= button_to "Log out", destroy_user_session_path, method: :delete %>
私のapplication.rbが持っていたように、私はこれを別の方法で行かなければなりませんでした:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
そしてまだ失敗していました。/environment/development、testおよびproduction.rbでconfig.serve_static_assets = true
を設定する必要がありました。 このリンク は、私がそれを理解するのに役立ちました。
また、Railsアプリに複数のjqueryソースがある場合は、Gemfileで指定されているデフォルトのものを使用する必要があります
gemfileにこれがあることを確認してください
gem 'jquery-Rails'
また、アセットには他のJQueryソースファイルはありません。
私の場合、Gemfileで宣言されているデフォルト以外の2番目のJQueryファイルがあるため、競合が発生しました。
以前にそれらのソースを使用していた場合、以前にそれを行っていた場合は、必ずアセットを再度プリコンパイルしてください
Http DELETEメソッドを使用する方が安らかなことに同意します。単純なエンドポイントを作成して、GETメソッドでユーザーセッションを破棄するのが好きです。
これをconfig/routes.rbに追加することにより
devise_scope :user do
get '/logout', :to => 'sessions#destroy'
end
本番環境でこの問題を発見し、アセットパイプラインを使用している場合、次のことが必要になることがよくあります。
rake assets:clobber
公共資産を整理するため。その後、rake assets:precompile
コードをコミットしてプッシュする前(Pushがプリコンパイルする場合を除き、別名Heroku)。
理由は接続順序が間違っている可能性がありますbootstrap-sprockets
正しい順序:
// app/assets/javascripts/application.js
...
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require bootstrap-sprockets
//= require_tree .
1)gemの下にインストールする必要があるかもしれないと感じています:メソッドを使用したリクエスト:
https://github.com/Rails/jquery-Rails
2)application.jsにこの2行を追加します
//= require jquery
//= require jquery_ujs
上記の Tombart で述べたように、私に対する答えは、application.jsファイルにRails-ujs呼び出しを戻すことでした。
//= require Rails-ujs
//= require turbolinks
フッターのスクリプトが再評価されるのを防ぐために、最初にそれらを削除しました。私の回避策は、フッターに必要なリソースでfooter.jsコンパイルファイルを作成することでした。
//= require jquery-3.2.1.min
//= require jquery-ui-1.12.1.min
//= require materialize
//= require init
次に、/ initializers/assets.rbファイルにプリコンパイルを追加します
Rails.application.config.assets.precompile += %w( footer.js )
次に、layout/application.html.erbファイルで次を呼び出すことができます。
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'footer' %>
アプリケーション行をヘッダーに保持し、bodyタグの終わりの前に新しい「フッター」呼び出しを追加しました。