我是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我认为它更短。
感谢您的解释。
答案 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