Rails 4接受嵌套属性id不能为空

时间:2015-10-13 14:05:49

标签: ruby-on-rails ruby-on-rails-4

我正在尝试使用一个表单更新两个模型。一切似乎都结账,期望两个模型都不会保存(无效),因为所需的customer_order_id。如何首先保存customer_order,以便它生成一个ID然后填充付款?

def create

@customer_order = CustomerOrder.new(customer_order_params)

if current_user.id.present?
@customer_order.user_id = current_user.id
@customer_order.payments.first.user_id = current_user.id      
end 



respond_to do |format|
  if @customer_order.save


    format.html { redirect_to @customer_order, notice: 'Customer order was successfully created.' }

当我检查模型是否有效时?这是error.message

{:"payments.customer_order_id"=>["can't be blank"], :payments=>["is invalid"]}

据我了解,customer_order将首先创建订单,然后创建付款。在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

验证在保存到数据库之前运行。由于客户订单尚未保存,因此无法在此情况下验证customer_order_id的存在。

请考虑验证customer_order的存在。这允许验证在客户订单出现时通过,无论是否已保存。

买者

通过关联和嵌套属性构建记录时,ActiveRecord将根据反向关联进行分配。在您的情况下,使用的逆关联是paymentsCustomerOrder}和customer_orderPayment上)。当通过嵌套属性构建付款时,ActiveRecord将使用这些来正确设置payment.customer_order。如果ActiveRecord无法确定反向关联(由于命名,关联中的连接等),那么您可能需要在每个关联中明确添加:inverse_of选项。

答案 1 :(得分:0)

在你的创建后钩子中创建第一笔付款(在customer_order模型中)

#Customer order model
after_create :create_first_payment

def create_first_payment
  self.payments.create(user_id: user_id)
end