ruby on rails - How do I remove validation duplication from a model? -
short of extracting shipping , billing addresses address model, how can remove validation duplication?
i want validate billing address if it's not same shipping address. how go extracting module? example helpful never know include in modules, or self refers to.
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? }
you can make method , pass in bits different between 2 types of addresses. in case, difference prefix word fields , ability pass in options.
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
Comments
Post a Comment