Rails: Scope: 使一个方法对所有视图和控制器可用

7

我在处理作用域方面遇到了一些困难。我希望有少量的方法可以在所有视图和控制器中使用。 假设代码如下:

def login_role
  if current_user
    return current_user.role
  end
  return nil
end

如果我把它包含在application_helper.rb中,那么它只对所有视图可用,但不对所有控制器可用。
如果我将其包含在application_controller.rb中,则它对所有控制器可用,但不对所有视图可用。
2个回答

31

在您的ApplicationController中使用helper_method方法,以使视图可以访问它。

class ApplicationController < ActionController::Base

  helper_method :login_role

  def login_role
    current_user ? current_user.role : nil
  end

end

考虑将所有相关的方法放在自己的模块中,然后您可以像这样使它们全部可用:

helper LoginMethods


我应该把LoginMethods模块放在哪里? - EastsideDev
大多数人将其放在RAILS_ROOT/lib中。 - Dean Brundage
有什么原因比我建议的更好吗?两个建议都涉及添加库模块。不使用 require 会节省重新启动的时间吗? - EastsideDev
你所建议的方法行不通。如果我在lib文件夹中创建一个login_method.rb文件,并在其中包含一个名为LoginMethods的模块,其中包含所有我的登录方法,然后添加helper_method LoginMethods,我会收到错误消息。我已经重启了Rails服务器,以防万一。 - EastsideDev
@EastsideDeveloper:helper_method 适用于单个方法。helper 接受一个模块作为参数。 - Dean Brundage

-4
创建自己的库(它可以有类、模块和方法),并将其放在lib目录下。我们称其为my_lib.rb。
在你的application_controller.rb和application_helper.rb中添加以下行:
require 'my_lib'

这将使所有的类、模块和方法对所有的视图和控制器都可用。

lib目录中的文件已经被框架要求了。您还需要在application_controller.rbapplication_helper.rb中调用include MyLib - Dean Brundage

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