4

我有一个旧版 Rails 3.2 应用程序,我在其中使用 Devise 进行身份验证。以前,Devise 一直在为其 SessionController 使用默认应用程序布局,并且所有应用程序的控制器都显式声明了layout "public". 我决定将公共布局更改为application.haml,并将之前的应用程序布局更改为devise.haml。为了确保Devise::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'是安装设计的可安装引擎的当前命名空间。如果你从这里调用它,只需使用'application'标准应用程序)。

会话控制器示例

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 回答