web-dev-qa-db-ja.com

Helper Devise:リクエスト環境で `Warden :: Proxy`インスタンスを見つけることができませんでした

RailsアプリにDeviseを使用しようとしています。サインアップしてログインできますが、他のページ「ビルド」に移動すると、次のエラーが発生します。

Home#show DeviseのDevise :: MissingWardenは、リクエスト環境でWarden::Proxyインスタンスを見つけることができませんでした。アプリケーションが期待どおりにDeviseとWardenをロードしていること、およびミドルウェアスタックにWarden::Managerミドルウェアが存在することを確認してください。テストの1つでこれが発生している場合は、テストがRailsミドルウェアスタックを実行しているか、またはテストがDevise::Test::ControllerHelpersモジュールを使用してrequest.env['warden']オブジェクト。

これが私のコントローラーです:

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  private
  # Overwriting the sign_out redirect path method
  def after_sign_out_path_for(resource_or_scope)
    build_path
  end
end

ここに私の2つの部分的なビューがあります:

<!-- views/devise/menu/_login_items.html.erb -->
<% if user_signed_in? %>
  <li>
  <%= link_to('Logout', destroy_user_session_path, :method => :delete) %>
  </li>
<% else %>
  <li>
  <%= link_to('Login', new_user_session_path)  %>
  </li>
<% end %>

そして

<!-- views/devise/menu/_registration_items.html.erb -->
<% if user_signed_in? %>
  <li>
  <%= link_to('Edit registration', edit_user_registration_path) %>
  </li>
<% else %>
  <li>
  <%= link_to('Register', new_user_registration_path)  %>
  </li>
<% end %>

デバッグ後、問題は私の「show」コントローラーの次の行にあることがわかりました:template = HomeController.render( 'layouts/_template')

ご協力いただきありがとうございます。

16
nico_lrx

アクションケーブルによって管理されているコードの一部でDevise current_userを取得しようとしたときに発生する可能性があります。コメントなどをレンダリングするバックグラウンドジョブのように。モデルまたはジョブレベルでwardenにアクセスできないため、コントローラーで次のようなものを使用してそれを解決できます(私の限られた知識によると):(CommentsController createアクションでコメントを作成した直後にジョブを呼び出します。編集ボタンと削除ボタンを含むコメントパーシャルをレンダリングするプライベートメソッド。current_userが必要でした)

 def create
@product = Product.find(comment_params[:product_id])
@comment = @product.comments.build(comment_params)
@comment.save!

gon.comment_id = @comment.id
gon.comment_user_id = @comment.user_id

ActionCable.server.broadcast "chat", comment: render_comment

render :create, layout: false
end


def render_comment
  CommentsController.renderer.instance_variable_set(:@env, {"HTTP_Host"=>"localhost:3000", 
    "HTTPS"=>"off", 
    "REQUEST_METHOD"=>"GET", 
    "SCRIPT_NAME"=>"",   
    "warden" => warden})

  CommentsController.render(
    partial: 'comments/comment_detail',
    locals: {
      product: @product,
      comment: @comment
    }
  )
end

これは、ワーデンの問題を解決するのに役立ちます。そのパーシャルでdeviseのcurrent_userを使用している場合は、コメントユーザーを提供します(そのユーザーがパーシャルのレンダリングを開始したため、そうであるように)。これを解決するために、フロントエンドフレームワークがある場合は、編集/削除などの一部のアクションを制限するために、Cookieから現在のユーザーをフェッチする必要がある場合があります。しかし、純粋なRailsで作業している場合、私が遭遇した解決策は、現在のユーザーIDを持つDOMに非表示フィールドを作成する必要があることであり、スクリプトで比較するためにそのIDをフェッチします。 。Rails javascriptの変数にアクセスする必要があるかもしれません。そのためには[〜#〜] gon [〜#〜] gem。私はこの回答に質問よりもはるかに多く含まれている可能性があることを知っていますが、私はたくさん検索しましたが、この問題に対する満足のいく解決策を見つけられなかったので、気軽に議論してください。

7
Fazal Karim

これに基づいてSO answerDevise::Test::ControllerHelpersモジュールのコントローラ仕様。 Rails_helperに以下を追加します。

RSpec.configure do |config|
  config.include Devise::Test::ControllerHelpers, type: :controller
end
31
Obromios

追加

config.include Devise::Test::ControllerHelpers, type: :controller

rails_helper.rbファイル内。

7
Neeraj Kumar

このエラーが発生し、他の場所で答えを見つけることができませんでした。これは、dbをドロップして作成した後です。しかし、スキーマをロードしませんでした。

これはそれを修正しました:

rake db:drop db:create db:schema:load
1
A B

'current_user'がいくつかの条件付きで存在するビューをテストするときに、同様の問題がありました。

私はこれでそれを解決しました:

let(:user) { FactoryGirl.create :customer }

before(:each) do
  allow(view).to receive(:current_user).and_return(user)
  ...
0

データベースが移行されていないときにこのエラーに遭遇しました。以下のコマンドでうまくいきました。

./bin/bundle exec rake db:migrate
0
AWippler