不能包含从Rails 5中的lib加载的模块

时间:2018-04-05 15:21:39

标签: ruby-on-rails

在我的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'

1 个答案:

答案 0 :(得分:1)

您所拥有的是对rails如何解析模块名称的简单误解。将目录添加到自动加载路径不会导致rails通过其子目录递归显示。

为了使轨道正确加载模块,必须将其声明为:

# lib/surveyable/surveyable.rb
module Surveyable::Surveyable
  extend ActiveSupport::Concern
end

这是因为自动加载器根据模块嵌套推断出文件路径。

或者您可以将文件移至lib/surveyable.rb

但是,由于您所写的内容似乎是一个模型问题,我会将其放在已添加到加载路径的app/models/concerns中。