【发布时间】:2021-02-23 22:44:52
【问题描述】:
我正在编写一个将添加到多个模型的 Rails Concern。为了更加安全,我想确保包含此问题的所有模型都响应某些实例方法。如果你愿意,可以称之为合同。
无论如何,这是我希望工作的代码:
module SomeConcern
extend ActiveSupport::Concern
included do
raise("The model has to respond to some_instance_method") if !self.method_defined?(:some_instance_method)
end
end
但是,这个异常总是被引发。
-
关注点通常(由于样式指南)包含在模型的顶部;但是,此时我们还没有到达模型中的
def调用,所以还没有定义实例方法。 -
即使我们将关注点包含在模型的最底部(为了更好的开发人员体验,我真的希望我可以避免这种情况),我注意到如果
some_instance_method实际上是一个列名,它只会响应true到method_defined?如果我事先实例化模型。
在included 块内使用binding.pry,会发生这种情况:
self.method_defined?(:some_column_name)
=> false
self.new
self.method_defined?(:some_column_name)
=> true
那么,考虑到所有这些,当关注点包含在模型中时,引发异常的最佳方法是什么,以确保该模型的一个实例实际响应我想要检查的某些方法?
【问题讨论】:
标签: ruby-on-rails activesupport-concern