我希望将特定于模型的某些功能子集的关注点分开。
我已经引用了 here 并遵循了这个模式

module ModelName::ConcernName
  extend ActiveSupport::Concern

  included do
    # class macros
  end

  # instance methods
  def some_instance_method

  end

  module ClassMethods
    # class methods here, self included
  end
end

但是,当我尝试启动服务器时,它会导致以下错误



我想知道对模型的某些子集函数进行关注的最佳方法是什么。

编辑

提供型号代码:
路径:app/models/rent.rb

现在我的模型中有很多检查逻辑
class Rent < ActiveRecord::Base
    def pricing_ready?
        # check if pricing is ready
    end

    def photos_ready?
        # check if photo is ready
    end

    def availability_ready?
        # check if availability setting is ready
    end

    def features_ready?
        # check if features are set
    end
end

我想把它分开
class Rent < ActiveRecord::Base
    include Rent::Readiness
end

并按命名空间组织关注点
路径:app/models/concerns/rent/readiness.rb
module Rent::Readiness
  extend ActiveSupport::Concern

  included do
    # class macros
  end

  # instance methods
  def pricing_ready?
    # check if pricing is ready
  end

  ...

  module ClassMethods
    # class methods here, self included
  end
end

现在,如果我只使用 RentReadiness 中的路径对 app/models/concerns/rent_readiness.rb 进行类,我就可以工作了

最佳答案

Rails 使用 activesupport 加载类和模块,因为它们是通过根据类或模块名称推断文件路径来定义的,这是在 Ruby 解析器加载文件并遇到尚未加载的新常量时完成的。在您的情况下,Rent 模型被解析为 Rent::Readlines 引用,此时 activesupport 开始查找与名称匹配的 rent/readlines.rb 代码文件。然后这个文件被 ruby​​ 解析,但是在第一行,引用了仍然卸载的 Rent 类,这会触发 activesupport 去寻找与名称匹配的代码文件。

关于ruby-on-rails - 基于模型名称的 Rails 命名空间问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37507321/

10-12 14:06