ApplicationHelper方法在Devise Controller中不可用

时间:2013-05-22 11:16:12

标签: ruby-on-rails devise

我有一个传统的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方法的使用,如何解决这个问题呢?

2 个答案:

答案 0 :(得分:0)

使用this response,我在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

答案 1 :(得分:0)

ApplicationHelper包含在您的控制器中

class Users::RegistrationsController < Devise::RegistrationsController
  include ApplicationHelper
  def new
    super do |resource|
      resource.type = your_helper_method
    end
  end
end