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