在我的rails 5应用程序中(在开发环境中)我有一些模块要从lib文件夹加载并包含在模型中。所以我设置了 application.rb
config.autoload_paths += %W(#{config.root}/lib)
该模块类似于
LIB / surveyable / surveyable.rb
require 'active_support/concern'
module Surveyable
extend ActiveSupport::Concern
class_methods do
def sjs_elements(&block)
....
end
end
end
包含在我的用户模型类中:
应用/模型/ user.rb
class User < ApplicationRecord
include Surveyable # <= this doesn't raise any error
sjs_elements do # <= *** NameError Exception: undefined local variable or method `sjs_elements' for User (call 'User.connection' to establish a connection):Class
....
end
....
end
我需要在 application.rb 的开头手动要求它才能使其工作,但这违反了rails惯例:
require_relative '../lib/surveyable/surveyable'
答案 0 :(得分:1)
您所拥有的是对rails如何解析模块名称的简单误解。将目录添加到自动加载路径不会导致rails通过其子目录递归显示。
为了使轨道正确加载模块,必须将其声明为:
# lib/surveyable/surveyable.rb
module Surveyable::Surveyable
extend ActiveSupport::Concern
end
这是因为自动加载器根据模块嵌套推断出文件路径。
或者您可以将文件移至lib/surveyable.rb
。
但是,由于您所写的内容似乎是一个模型问题,我会将其放在已添加到加载路径的app/models/concerns
中。