【问题标题】:ApplicationHelper methods not available in Devise Controller设计控制器中不可用的 ApplicationHelper 方法
【发布时间】:2013-05-22 11:16:12
【问题描述】:

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

【问题讨论】:

  • 遇到同样的问题...你解决了吗?
  • 这里也有同样的问题。

标签: ruby-on-rails devise


【解决方案1】:

ApplicationHelper 包含到您的控制器中

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

【讨论】:

    【解决方案2】:

    使用this response,我通过在有问题的控制器中声明helper "manager/application" 来包含在application_helpers.rb 中找到的所有帮助程序(如果'manager' 是安装设计的可安装引擎的当前命名空间。只需使用'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
    

    【讨论】:

      猜你喜欢
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 1970-01-01
      相关资源
      最近更新 更多