Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 验证是否存在发货地址,除非它是';和帐单地址一样_Ruby On Rails_Ruby_Testing_Rspec - Fatal编程技术网

Ruby on rails 验证是否存在发货地址,除非它是';和帐单地址一样

Ruby on rails 验证是否存在发货地址,除非它是';和帐单地址一样,ruby-on-rails,ruby,testing,rspec,Ruby On Rails,Ruby,Testing,Rspec,我的订单上有这个。我想验证是否存在发货地址,除非它与账单地址相同。然而,我的规格一直不合格 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_at

我的订单上有这个。我想验证是否存在
发货地址
,除非它与
账单地址
相同。然而,我的规格一直不合格

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
表格编号:

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

您的
ship\u to\u billing\u 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
irb(main):001:0>课程顺序
irb(主要):002:1>属性编写器:stba
irb(主):003:1>def stba
irb(main):004:2>@stba | |=真
irb(主):005:2>结束
irb(主):006:1>结束
=>零
irb(主要):007:0>
irb(主):008:0*o=Order.new
=> #
irb(主):009:0>o.stba=false
=>错误
irb(主要):010:0>o.stba
irb(主):011:0>类顺序2
irb(主要):012:1>属性编写器:stba
irb(主):013:1>def stba
irb(main):014:2>如果@stba.nil?
irb(main):015:3>@stba=true
irb(主要):016:3>其他
irb(主要):017:3*@stba
irb(主):018:3>结束
irb(主):019:2>结束
irb(主):020:1>结束
=>零
irb(主):021:0>o=Order2.new
=> #
irb(主):022:0>o.stba=false
=>错误
irb(主):023:0>o.stba
=>错误

谢谢。在它的核心,我想初始化
发送到\u账单地址
,然后根据表单更改它。这是最好的方法吗?谢谢。我的规格现在通过了。但是表单仍然显示账单地址的错误,尽管选中了复选框!知道为什么吗?我添加了表单代码。我认为这是一个单独的问题,应该有自己的帖子。我会检查服务器日志,以查看发送到应用程序的参数,并查看控制器代码。我解决了问题<代码>发货至账单地址?返回1和0,不是真或假。
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