Ruby on rails 如何从模型中删除重复验证?

Ruby on rails 如何从模型中删除重复验证?,ruby-on-rails,ruby,refactoring,duplicate-removal,Ruby On Rails,Ruby,Refactoring,Duplicate Removal,除了将发货地址和帐单地址提取到地址模型中之外,我如何删除此重复验证 我只想验证账单地址,如果它与发货地址不同。如何将其提取到模块中?举个例子会很有帮助,因为我从来不知道模块中应该包含什么,或者self指的是什么 validates :shipping_name, :shipping_address1, :shipping_street_number, :shipping_city, presence: true validates :shipping_state, inclusion:

除了将发货地址和帐单地址提取到地址模型中之外,我如何删除此重复验证

我只想验证账单地址,如果它与发货地址不同。如何将其提取到模块中?举个例子会很有帮助,因为我从来不知道模块中应该包含什么,或者
self
指的是什么

  validates :shipping_name, :shipping_address1, :shipping_street_number, :shipping_city, presence: true
  validates :shipping_state, inclusion: { in: Address.states.values }
  validates :shipping_post_code, length: { is: 5 }, numericality: { only_integer: true }

  validates :billing_name, :billing_address1, :billing_street_number, :billing_city, presence: true, unless: -> { self.bill_to_shipping_address? }
  validates :billing_state, inclusion: { in: Address.states.values }, unless: -> { self.bill_to_shipping_address? }
  validates :billing_post_code, length: { is: 5 }, numericality: { only_integer: true }, unless: -> { self.bill_to_shipping_address? }

您可以创建一个方法,然后传入两种地址之间不同的位。在这种情况下,区别在于字段的前缀词和传入额外选项的能力

module AddressValidator
  def validates_address(type, options = {})
    validates :"#{type}_name", :"#{type}_address1", :"#{type}_street_number", :"#{type}_city", {presence: true}.merge(options)
    validates :"#{type}_state", {inclusion: { in: Address.states.values }}.merge(options)
    validates :"#{type}_post_code", {length: { is: 5 }, numericality: { only_integer: true }}.merge(options)
  end
end

class MyModel < ActiveRecord::Base
  extend AddressValidator
  validates_address(:shipping)
  validates_address(:billing, unless: -> { self.bill_to_shipping_address? })
end
模块地址验证程序
def验证_地址(类型,选项={})
验证:“#{type}{u name”、:“#{type}}{u address1”、:“#{type}{u street}{u number”、:“#{type}{u city”、{presence:true}.merge(选项)
验证:“#{type}_state”、{inclusion:{in:Address.states.values}}.merge(选项)
验证:“#{type}_post_code”,{length:{is:5},数值性:{only_integer:true}}。合并(选项)
结束
结束
类MyModel{self.bill_to_shipping_address?})
结束

谢谢。我现在不得不问自己这是否值得。