我希望将特定于模型的某些功能子集的关注点分开。
我已经引用了 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/