【问题标题】:can't include modules loaded from lib in Rails 5不能在 Rails 5 中包含从 lib 加载的模块
【发布时间】:2018-09-15 11:51:33
【问题描述】:

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

包含在我的用户模型类中:

app/models/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'

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    您对 rails 如何解析模块名称有一个简单的误解。将目录添加到自动加载路径不会导致 rails 递归地查看其子目录。

    为了让 rails 正确加载模块,它必须声明为:

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

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

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

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

    【讨论】:

    • 我仍然有些困惑,为什么你没有收到来自 include Surveyable 的名称错误 - 但 Rail 的自动加载是一种奇怪而神秘的野兽。
    • 这可能是因为我在同一个模块中有其他类位于正确的路径下,例如 lib/surveyable/sjs_model.rb。非常感谢
    猜你喜欢
    • 2012-10-23
    • 2017-07-14
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 2016-11-07
    相关资源
    最近更新 更多