如何在创建时关联现有的嵌套资源?

时间:2014-05-06 15:58:00

标签: ruby-on-rails activerecord nested-forms

我有这个型号:

class Product < ActiveRecord::Base
  has_many :product_images, dependent: :destroy, autosave: true

  accepts_nested_attributes_for :product_images, allow_destroy: true
end

在保存新产品之前,我通过ajax创建了一堆ProductImage模型。 ajax为productImage创建表单输入:id,:feature和:_destroy属性在product_images_attributes上,我在日志中正确地看到了这些参数:

"product" => {"name" => "Test", "product_images_attributes"=>{"0"=>{"id"=>"112", "featured" => "true", "_destroy"=>""}}}

在我的控制器中,我在#create中执行此操作:

@product = Product.new(params.require(:product).permit!)
@product.save

当我传递这些参数时,当我尝试分配参数时,我得到了这个错误:

ActiveRecord::RecordNotFound (Couldn't find ProductImage with ID=112 for Product with ID=)

数据库显示ID = 112的ProductImage与product_id = null一样存在。

当然,在更新现有产品时一切正常。

如何使用标准导轨方法将现有ProductImages与创建新记录相关联?

1 个答案:

答案 0 :(得分:-1)

nested_attributes不是我推荐的方式。这是非常有益的。我建议使用form objects

您可以这样做:

class ProductCreation
  include ActiveModel::Model

  attr_accessor :product_name, :product_image_ids

  def save
    images = product_image_ids.map {|id| Image.find(id) }
    product = Product.new(name: product_name)
    product.images = images
    product.save
  end
end

在控制器和视图中使用ProductCreation