ApplicationHelper方法在Devise Controller中不可用。

5

我有一个遗留的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方法,我该如何解决这个问题?

遇到了同样的问题...你解决了吗? - Brandon
这里也有同样的问题。 - SnakeWasTheNameTheyGaveMe
2个回答

2
ApplicationHelper 包含到您的控制器中。
class Users::RegistrationsController < Devise::RegistrationsController
  include ApplicationHelper
  def new
    super do |resource|
      resource.type = your_helper_method
    end
  end
end

0
根据 this response 的工作原理,通过在有关的控制器中声明 helper "manager/application" 来包含在 application_helpers.rb 中找到的所有帮助程序(如果“manager”是您安装 devise 的可安装引擎的当前命名空间,请使用“application” 如果您从标准应用程序调用此操作,只需使用“应用程序”)。
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接