Rails全局功能可用于所有对象

时间:2019-03-22 14:02:12

标签: ruby-on-rails

我想制作一个函数current_order_week,该函数在我的应用程序中全局可用,并且可以像类似current_user的方式调用。我不想在特定的模型/控制器中include使用它,我只想在任何地方使用它。

我已经修改了/lib文件夹,使其包含一个lib_extensions.rb文件,并将其添加到该文件中:

class Object
    def current_order_week
    end
end

我已将application.rb修改为包括:

config.autoload_paths << Rails.root.join('lib')
config.eager_load_paths << Rails.root.join('lib')

但是当我尝试从控制台或测试中调用current_order_week时,我仍然看到:

  

NameError: undefined local variable or method 'current_order_week' for main:Object

我还需要做什么?

3 个答案:

答案 0 :(得分:1)

您应该在application_helper.rb文件中添加此功能。所有控制器都从ApplicationController扩展,并且ApplicationController包括ApplicationHelper

module ApplicationHelper
  def current_order_week
  end
end

这将可用于视图和控制器

答案 1 :(得分:0)

Object这样的猴子修补核心类通常不是一个好主意,这可能会干扰某些gems等,并且通常会在将来导致痛苦的调试。

如果您绝对想这样做-自动加载不会从lib中提取Object,因为它已经定义。在config/initializers中创建一个初始化程序,然后将其加载,但不会在代码更改时重新加载。

但是更好的方法是在ApplicationHelperApplicationRecordApplicationController中包含这样的代码

答案 2 :(得分:0)

autoload_pathseager_load_paths不包含模块,它们仅包含定义模块的require文件。要使用current_order_week,您需要指定模块的名称:

module Foo
  def current_order_week
    .
    .
    .
  end
end

Foo.current_order_week()

为了不使用模块名称而使用current_order_week,您需要在控制器和模型中包括Foo

class ApplicationController < ActionController::Base
  include Foo

  def some_action
    current_order_week()
  end
end

class ApplicationRecord < ActiveRecord::Base
  include Foo
end