如果第一个条件为零,则将变量分配给备份 - ruby​​

时间:2017-03-01 22:00:16

标签: ruby-on-rails ruby

我正在尝试使用值设置变量。但在某些情况下,这个值将不存在。在场景中,我想将其设置为我构建的Null类。以下是我正在使用的内容:

coupon = rsvp.purchases.map(&:coupon) || NullCoupon.new

这条线我试图说 - if rsvp.purchases.coupons is nil assign coupon to NullCoupon.new。我显然做错了什么,但我怎么能做到这一点?

错误

ActionView::Template::Error (undefined method "coupon" for #<Purchase::ActiveRecord_Associations_CollectionProxy:0x007fadb410a478>

2 个答案:

答案 0 :(得分:2)

修改

我现在从错误中看到问题不在于您的||运算符,而是您的rsvp.purchases.map(&:coupon)方法链接。它没有为其中一次购买找到coupon

您可以通过确保购买总是包含带有验证的优惠券来解决此问题,或者您可以使用Rails中的.try方法。

Try method in Rails

<强>原始

在Ruby中,nilfalse是唯一不真实的东西。所以, 优惠券将等于rsvp.purchases.map(&:coupon),除非rsvp.purchases.map(&:coupon)等于nilfalse

您能否更具体一些,并举例说明您收到的错误?

以下示例:

irb(main):019:0> coupon = nil || 1
=> 1
irb(main):020:0> coupon = "" || 1
=> ""
irb(main):021:0> coupon = false || 1
=> 1
irb(main):022:0> coupon = 4 || 1
=> 4
irb(main):023:0> coupon = OpenStruct.new || 1
=> #<OpenStruct>
irb(main):024:0> coupon = false || OpenStruct.new
=> #<OpenStruct>
irb(main):025:0> coupon = nil || OpenStruct.new  
=> #<OpenStruct>

答案 1 :(得分:2)

您可以获取优惠券数组的第一个元素,如果没有元素,则为零。

(这假设优惠券与购买之间存在多对一关系)

coupon = rsvp.purchases.coupons.first || NullCoupon.new