2013-05-08 66 views
0

我的訂單類中有這個。我想驗證shipping_address的存在,除非它與billing_address相同。然而,我的規格仍然失敗。驗證送貨地址的存在,除非它與帳單地址相同

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 

但我不斷收到失敗的規格(例如預計爲無效):

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 

表單代碼:

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

回答

1

ship_to_billing_address方法的實現是錯誤的。它將@ship_to_billing_address設置爲true即使設置爲false之前。這是更正確的執行:

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

例子:

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 
+0

謝謝。它的核心是我想將'ship_to_billing_address'初始化爲'true',然後根據表單進行更改。這是做這件事的最好方法嗎? – Mohamad 2013-05-08 19:31:55

+0

查看我的更新。 – DNNX 2013-05-08 19:32:44

+0

謝謝。我的規格現在已經過去了。但是儘管複選框被選中,該表單仍然顯示帳單地址的錯誤!任何想法爲什麼?我添加了表單代碼。 – Mohamad 2013-05-08 19:38:47