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')
ご協力いただきありがとうございます。
アクションケーブルによって管理されているコードの一部で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。私はこの回答に質問よりもはるかに多く含まれている可能性があることを知っていますが、私はたくさん検索しましたが、この問題に対する満足のいく解決策を見つけられなかったので、気軽に議論してください。
これに基づいてSO answerDevise::Test::ControllerHelpers
モジュールのコントローラ仕様。 Rails_helperに以下を追加します。
RSpec.configure do |config|
config.include Devise::Test::ControllerHelpers, type: :controller
end
追加
config.include Devise::Test::ControllerHelpers, type: :controller
rails_helper.rbファイル内。
このエラーが発生し、他の場所で答えを見つけることができませんでした。これは、dbをドロップして作成した後です。しかし、スキーマをロードしませんでした。
これはそれを修正しました:
rake db:drop db:create db:schema:load
'current_user'がいくつかの条件付きで存在するビューをテストするときに、同様の問題がありました。
私はこれでそれを解決しました:
let(:user) { FactoryGirl.create :customer }
before(:each) do
allow(view).to receive(:current_user).and_return(user)
...
データベースが移行されていないときにこのエラーに遭遇しました。以下のコマンドでうまくいきました。
./bin/bundle exec rake db:migrate