web-dev-qa-db-ja.com

工夫:ログアウトリンクが機能しないのはなぜですか?

問題:簡単に言えば、ログアウトリンクをアプリにインストールしようとすると、機能しません。ここに私が考えることができる限り多くのコンテキストがあります(何か他のものが必要な場合は、私をつついてください)...

私はこれを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"}

誰にもアイデアはありますか?

43
jaydel

問題は、ログ内のサインアウトリクエストが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にすると、問題が解決する場合があります。

16
Olives

これを修正する正しい方法は、RESTごとに、DELETEメソッドを使用するようにログアウトリンクを変更することです。これは非常に簡単な修正で、これを変更します:

link_to "Log out", destroy_user_session_path

これに:

link_to "Log out", destroy_user_session_path, :method => :delete 
83
Jay Beale

application.jsからこの行を削除したときに、Rails 3.2で同じ問題が発生しました。

//= require jquery_ujs

そのため、application.jsにこの行を挿入する必要があると思います。

PS。この動作は、Rails用アダプターjqueryが機能しないことを意味します。したがって、ブラウザのhtmlにロードされているかどうかを確認する必要があります。実稼働環境では圧縮されたjsがあり、そこで何かを見つけるのは非常に難しいため、開発モードでテストする必要があります。

33
ka8725

両方が必要です
link_to "Log out", destroy_user_session_path, method: :delete

&&これらはapplication.jsに含まれています

//= require jquery
//= require jquery_ujs

。明らかに、何らかの理由で存在しない場合は、これをGemfileに追加することを忘れないでください。

gem 'jquery-Rails'

6
webgen

dELETEを使用して要求を実行するには、jQueryが必要です。 application.jsから削除していないことを確認してください。

4
Christoph

これは古い質問ですが、受け入れられた答えは、この問題を解決する適切な方法ではありません(ただし、問題の適切な診断です)。

今日私がこれに遭遇したとき、私のroutesファイルは次のように見えました:

  root :to => 'welcome#index' 

  resources :users    
  devise_for :users

Olivesが述べたように、resourcesステートメントは/ users/anythingをトリップさせるだけです。私は単にルートの順序を逆にする必要がありました...

 root :to => 'welcome#index' 

  devise_for :users
  resources :users
4
pws5068

私はこのすべてのソリューションをチェックしましたが、誰も私のために働いていません。最後に、ヘッダーでアプリケーションタグとcsrfメタを含む2行を削除したことがわかりました

だから、誰かがこの時点で解決なしでこの問題を抱えている場合-ページのヘッダーにあるかどうかを確認してください(HAML表記)

= javascript_include_tag 'application'
= csrf_meta_tags 
2
RafeekPro

これは古い質問ですが、JavaScriptを必要としない方法が必要でした。 Railsは、methoddeleteに設定する隠し入力を持つ要求のような「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>
2
Ross Allen

また、確認する必要があります、resources :usersdevise_for :usersとは、リンクメソッドの削除です

link_to "Logout", destroy_user_session_path, method: :delete

両方が正しい場合、ログアウトボタンが機能するはずです

1
user212131

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

私のapplication.rbが持っていたように、私はこれを別の方法で行かなければなりませんでした:

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

そしてまだ失敗していました。/environment/development、testおよびproduction.rbでconfig.serve_static_assets = trueを設定する必要がありました。 このリンク は、私がそれを理解するのに役立ちました。

1
ScottJShea

また、Railsアプリに複数のjqueryソースがある場合は、Gemfileで指定されているデフォルトのものを使用する必要があります

gemfileにこれがあることを確認してください

gem 'jquery-Rails'

また、アセットには他のJQueryソースファイルはありません。

私の場合、Gemfileで宣言されているデフォルト以外の2番目のJQueryファイルがあるため、競合が発生しました。

以前にそれらのソースを使用していた場合、以前にそれを行っていた場合は、必ずアセットを再度プリコンパイルしてください

1
Leonard Kakande

Http DELETEメソッドを使用する方が安らかなことに同意します。単純なエンドポイントを作成して、GETメソッドでユーザーセッションを破棄するのが好きです。

これをconfig/routes.rbに追加することにより

devise_scope :user do
  get '/logout',  :to => 'sessions#destroy'
end
0
errata

本番環境でこの問題を発見し、アセットパイプラインを使用している場合、次のことが必要になることがよくあります。

rake assets:clobber公共資産を整理するため。その後、rake assets:precompileコードをコミットしてプッシュする前(Pushがプリコンパイルする場合を除き、別名Heroku)。

0
EARnagram

理由は接続順序が間違っている可能性がありますbootstrap-sprockets

正しい順序:

// app/assets/javascripts/application.js

...

//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require bootstrap-sprockets
//= require_tree .
0
askrynnikov

1)gemの下にインストールする必要があるかもしれないと感じています:メソッドを使用したリクエスト:

https://github.com/Rails/jquery-Rails

2)application.jsにこの2行を追加します

//= require jquery
//= require jquery_ujs
0
Gurudath BN

上記の 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タグの終わりの前に新しい「フッター」呼び出しを追加しました。

0
wsizoo