两种Rails模块之间的差异包括回调?

时间:2014-07-31 08:06:40

标签: ruby-on-rails ruby ruby-on-rails-4

我是Rails的新手。我有一个名为AdvItem的模型,基本上我想要做的是将所有验证语句移动到名为AdvItemValidation的模块。经过一些搜索后,我得到的是:

module AdvItemValidation
  extend ActiveSupport::Concern

  included do
    # validations
    validates :link, presence: true
    validate :check_valid_link
  end

  def check_valid_link
    ...
  end
end

但我刚看到另一种方法:

module AdvItemValidation
  extend ActiveSupport::Concern

  def self.included(base)
    # validations
    base.validates :link, presence: true
    base.validate :check_valid_link
  end

  def check_valid_link
    ...
  end
end

那么这两种实施方式有什么区别?如果我有很多默认和自定义验证语句,哪种方式更好?

PS:对于第一种方式CodeClimate报告此消息“方法之外的AdvItemValidation定义中的非常复杂的代码”,但imho我认为它更短。

感谢您的解释。

2 个答案:

答案 0 :(得分:1)

下面的表格

def self.included(base)

是模块包含在另一个模块和类中时调用的默认回调。

另一种形式

included do

由ActiveSupport :: Concern

提供

如果您正在使用主动支持和关注,则应优先使用此表单。如果不是,你仍然会被限制在第一张表格中。

来自Concern的包含主要是语法糖,尽管它确实更优雅地处理依赖关系。

这里有一些进一步的解释http://api.rubyonrails.org/classes/ActiveSupport/Concern.html

答案 1 :(得分:1)

第二个代码片段是ruby ruby​​代码。

  def self.included(base)
    # validations
    base.validates :link, presence: true
    base.validate :check_valid_link
  end

它不依赖于任何库。

第一段代码依赖于ActiveSupport,因此如果不包含该库,将无法工作。

  included do
    # validations
    validates :link, presence: true
    validate :check_valid_link
  end