我想制作一个函数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
我还需要做什么?
答案 0 :(得分:1)
您应该在application_helper.rb
文件中添加此功能。所有控制器都从ApplicationController
扩展,并且ApplicationController
包括ApplicationHelper
。
module ApplicationHelper
def current_order_week
end
end
这将可用于视图和控制器
答案 1 :(得分:0)
像Object
这样的猴子修补核心类通常不是一个好主意,这可能会干扰某些gems等,并且通常会在将来导致痛苦的调试。
如果您绝对想这样做-自动加载不会从lib中提取Object
,因为它已经定义。在config/initializers
中创建一个初始化程序,然后将其加载,但不会在代码更改时重新加载。
但是更好的方法是在ApplicationHelper
,ApplicationRecord
和ApplicationController
中包含这样的代码
答案 2 :(得分:0)
autoload_paths
和eager_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