简体   繁体   中英

Validate presence of shipping address unless it's same as billing address

I have this in my Order class. I want to validate the presence of shipping_address unless it's the same as the billing_address . My specs keep failing, however.

class Order < ActiveRecord::Base
  attr_writer :ship_to_billing_address

  belongs_to :billing_address,  class_name: 'Address'
  belongs_to :shipping_address, class_name: 'Address'

  accepts_nested_attributes_for :billing_address, :shipping_address

  validates :shipping_address, presence: true, unless: -> { self.ship_to_billing_address? }

  def ship_to_billing_address
    @ship_to_billing_address ||= true
  end

  def ship_to_billing_address?
    self.ship_to_billing_address
  end
end

But I keep getting failed specs (expected example not to be valid):

describe "shipping_address_id" do
  context "when shipping address is different from billing address" do
    before { @order.ship_to_billing_address = false }
    it_behaves_like 'a foreign key', :shipping_address_id
  end
end

shared_examples 'a foreign key' do |key|
  it "can't be nil, blank, or not an int" do
    [nil, "", " ", "a", 1.1].each do |value|
      @order.send("#{key}=", value)
      @order.should_not be_valid
    end
  end
end

Form code:

= f.check_box :ship_to_billing_address
| Use my shipping address as my billing address.

Your ship_to_billing_address method implementation is wrong. It sets @ship_to_billing_address to true even if was set to false before. This is more correct implementation:

   def ship_to_billing_address
     @ship_to_billing_address = true if @ship_to_billing_address.nil?
     @ship_to_billing_address   
   end

Examples:

irb(main):001:0> class Order
irb(main):002:1>   attr_writer :stba
irb(main):003:1>   def stba
irb(main):004:2>     @stba ||= true
irb(main):005:2>   end
irb(main):006:1> end
=> nil
irb(main):007:0> 
irb(main):008:0* o = Order.new
=> #<Order:0x8bbc24c>
irb(main):009:0> o.stba = false
=> false
irb(main):010:0> o.stba


irb(main):011:0> class Order2
irb(main):012:1>   attr_writer :stba
irb(main):013:1>   def stba
irb(main):014:2>     if @stba.nil?
irb(main):015:3>       @stba = true
irb(main):016:3>     else
irb(main):017:3*       @stba
irb(main):018:3>     end
irb(main):019:2>   end
irb(main):020:1> end
=> nil
irb(main):021:0> o = Order2.new
=> #<Order2:0x8b737e0>
irb(main):022:0> o.stba = false
=> false
irb(main):023:0> o.stba
=> false

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM