【问题标题】:Rails: Scope: making a method available to all Views and ControllersRails:范围:使方法可用于所有视图和控制器
【发布时间】:2012-07-02 22:37:58
【问题描述】:

几天来,我一直在与范围作斗争。我想为所有视图和控制器提供少量方法。 假设代码是:

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

如果我将它包含在 application_helper.rb 中,那么它只对所有 View 可用,但对所有 Controller 不可用

如果我将它包含在 application_controller.rb 中,那么它对所有 Controller 都可用,但对所有 View 不可用。

【问题讨论】:

    标签: ruby-on-rails scope


    【解决方案1】:

    使用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 模块放在哪里?
    • 大多数人把它放在RAILS_ROOT/lib
    • 有什么理由比我建议的更好吗?这两个建议都涉及添加库模块。不使用require保存重启吗?
    • 你的建议不起作用。如果我在 lib 文件夹中创建一个 login_method.rb,并在其中包含一个包含我所有登录方法的模块 LoginMethods,然后添加 helper_method LoginMethods,我会收到一条错误消息。为了以防万一,我重新启动了 Rails 服务器。
    • @EastsideDeveloper: helper_method 适用于个别方法。 helper 将模块作为参数。
    【解决方案2】:

    创建您自己的库(它可以包含类、模块、方法),并将其放在 lib 目录中。我们称之为 my_lib.rb。

    在您的 application_controller.rb 和 application_helper.rb 中添加以下行:

    require 'my_lib'
    

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

    【讨论】:

    • 框架已经需要lib 目录中的文件。您还必须在 application_controller.rb 和 application_helper.rb 中调用include MyLib
    猜你喜欢
    • 2014-07-28
    • 2013-09-05
    • 2015-10-12
    • 2019-10-11
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多