rails:控制器中包含的模块的方法在视图中不可用

时间:2009-08-12 10:08:56

标签: ruby-on-rails namespaces helpers

奇怪的是 - 我在lib/中有身份验证模块,如下所示:

module Authentication
  protected

  def current_user
    User.find(1)
  end

end

并且在ApplicationController中我包含了这个模块和所有帮助器,但是方法current_user在控制器中可用,但不在视图中:(如何使其工作?

2 个答案:

答案 0 :(得分:30)

如果方法是直接在控制器中定义的,则必须通过调用helper_method :method_name使其可用于视图。

class ApplicationController < ActionController::Base

  def current_user
    # ...
  end

  helper_method :current_user
end

使用模块,您也可以这样做,但这有点棘手。

module Authentication
  def current_user
    # ...
  end

  def self.included m
    return unless m < ActionController::Base
    m.helper_method :current_user # , :any_other_helper_methods
  end
end

class ApplicationController < ActionController::Base
  include Authentication
end

啊,是的,如果您的模块是严格意义上的帮助模块,您可以像Lichtamberg所说的那样做。但话说回来,您可以将其命名为AuthenticationHelper并将其放在app/helpers文件夹中。

虽然根据我自己的身份验证代码经验, 希望控制器和视图都可以使用它。因为通常你会在控制器中处理授权。帮助者可以独家观看。 (我相信它们最初是作为复杂html构造的缩写。)

答案 1 :(得分:1)

你用

声明了吗?
  helper :foo             # => requires 'foo_helper' and includes FooHelper
  helper 'resources/foo'  # => requires 'resources/foo_helper' and includes Resources::FooHelper
在ApplicationController中

http://railsapi.com/doc/rails-v2.3.3.1/classes/ActionController/Helpers/ClassMethods.html#M001904