我正在尝试处理Invoice.created的Stripe Webhook,并希望保存发票行项目。我的挑战是文件变量根据订单项类型而变化。
我尝试导入订单项时收到undefined method 'name' for nil:NilClass
,因为根据订单项的类型,计划对象可能为空。
我能够通过将update_attributes分成2来解决问题,只有在计划对象存在时才会发生这种情况。以下是我开始工作的内容。我希望有更好的方法。
@invoice_line_item = InvoiceLineItem.where(stripe_line_item_id: line_item.id).first_or_create(invoice_id: @invoice.id)
@invoice_line_item.update_attributes(
amount: line_item.amount,
currency: line_item.currency,
period_start: Time.at(line_item.period.start).strftime("%m-%d-%Y"),
period_end: Time.at(line_item.period.end).strftime("%m-%d-%Y"),
proration: line_item.proration,
item_type: line_item.type)
if line_item.plan.present?
@invoice_line_item.update_attributes(
plan_name: line_item.plan.name,
plan_interval: line_item.plan.interval,
plan_amount: line_item.plan.amount,
trial_period_days: line_item.plan.trial_period_days)
end
答案 0 :(得分:0)
你可以尝试
line_item.plan.try(:name)
以及所有line_item.plan
元素
如果主题为http://apidock.com/rails/Object/try
,尝试(在rails中)会给你nil它并没有真正排除零值,但如果line_item.plan
为零,则子值也将为nil
。如果这是正确的行为,那么您应该尝试try
。
更新:我今天早上点击了这篇coderwall帖子(https://coderwall.com/p/wamyow),提到delegate
与allow_nil: true
一起使用。你能做点什么吗
class InvoiceLineItem < ActiveRecord::Base
delegate :name, :interval, :amount, :trial_period_days, to: :plan, allow_nil: true
... rest of the class ...
end
然后仔细观察,我想知道为什么如果通过这种关系可以更新plan
上的所有line_item
属性?我错过了什么吗?