4

認証にDeviseを使用しているレガシーRails 3.2アプリがあります。以前は、Devise はそれの SessionController にデフォルトのアプリケーション レイアウトを使用しており、すべてのアプリのコントローラーは明示的に宣言されてlayout "public"いました。パブリック レイアウトをapplication.hamlに、以前のアプリケーション レイアウトをに変更することにしましたdevise.hamlDevise::SessionsControllerが正しいレイアウトを使用するようにするために、これをapplication.rbファイルに追加しました。

config.to_prepare do
  Devise::SessionsController.layout "devise"
end

ただし、これを追加すると、ApplicationHelper で定義されたビュー ヘルパーにアクセスできないため、統合テストが失敗し始めます。このようにコントローラーのレイアウトを変更すると、ApplicationHelper メソッドを使用できなくなるのはなぜですか? また、これを修正するにはどうすればよいですか?

4

2 に答える 2

1

ApplicationHelperコントローラーに含める

class Users::RegistrationsController < Devise::RegistrationsController
  include ApplicationHelper
  def new
    super do |resource|
      resource.type = your_helper_method
    end
  end
end
于 2019-05-21T15:08:20.897 に答える
0

この応答に基づいて、問題のコントローラー内に記述して、application_helpers.rb にあるすべてのヘルパーを含めますhelper "manager/application"('manager' がデバイスをマウントするマウント可能なエンジンの現在の名前空間である場合。標準アプリケーション)。

SessionsController の例

require_dependency "manager/application_controller"

module Manager
    class SessionsController < Devise::SessionsController
        # Without this line I get errors like 'undefined method link_to'
        helper "manager/application"
        layout "manager/application"

        def create
            resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#failure")
            sign_in_and_redirect(resource_name, resource)
        end

        def sign_in_and_redirect(resource_or_scope, resource=nil)
            scope = Devise::Mapping.find_scope!(resource_or_scope)
            resource ||= resource_or_scope
            sign_in(scope, resource) unless warden.user(scope) == resource
            return render :json => {:success => true}
        end

        def failure
            return render :json => {:success => false, :errors => ["Login failed."]}
        end
    end
end
于 2014-01-23T03:20:27.637 に答える