【问题标题】:Rails ActiveSupport:Concern that raises exception when included if the model doesn't respond_to? some methodsRails ActiveSupport:如果模型不响应,是否会引发异常?一些方法
【发布时间】: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 实际上是一个列名,它只会响应truemethod_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


    【解决方案1】:

    您可以在SomeConcern 中定义一个默认的some_instance_method,如果您在SomeModal 中没有同名的方法,则在调用它时raise 会出错:

    module SomeConcern
      extend ActiveSupport::Concern
    
      def some_instance_method
        raise("The model has to respond to some_instance_method")
      end
    end
    
    class SomeModal
      include SomeConcern
    
      def some_instance_method
        do_the_work
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 2013-09-21
      • 1970-01-01
      • 2012-02-05
      • 2018-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多