我的表单设置如下:
<%= simple_form_for @line_item do |f| %>
<%= f.input :product_id, as: :hidden, input_html: { value: @product.id } %>
<%= f.simple_fields_for :line_item_attributes do |attributes_form| %>
<%= attributes_form.association :product_attribute, collection: @product.product_attributes %>
<% end %>
<%= f.button :submit %>
<% end %>
我的创建操作如下所示:
def create
product = Product.find(params[:line_item][:product_id])
@line_item = @cart.line_items.build(product: product)
respond_to do |format|
if @line_item.save
format.html { redirect_to @line_item, notice: 'Line item was successfully created.' }
format.json { render :show, status: :created, location: @line_item }
else
format.html { render :new }
format.json { render json: @line_item.errors, status: :unprocessable_entity }
end
end
end
现在我基本上想扩展它,以便为line_item
构建嵌套属性。小问题是如果项目已经存在我希望记录不被创建,而是+ = 1.我想我可能要创建一个方法,任何人都有任何想法?
答案 0 :(得分:0)
您可能不需要额外的方法。
def create
product = Product.find(params[:line_item][:product_id])
@line_item = @cart.line_items.build do |line_item|
line_item.product = product
line_item.product_attribute = ProductAttribute.where(...).first || line_item.build_product_attribute()
end
...
end
line_item.product_attribute = ProductAttribute.where(...).first || line_item.build_product_attribute()
行根据product_attribute
中提供的条件分配现有where(...)
。如果找不到,我们会使用product_attribute
构建新的line_item.build_product_attribute
。