我正在开发电子商务商店,基本上我的产品可以有很多属性,从大小到颜色。
现在,我可以让用户将商品添加到购物车中。通过这样做:
<%= button_to 'Legg til', line_items_path(product_id: @product), remote: true %>
我的line_items_controller
创建操作如下所示:
def create
product = Product.find(params[:product_id])
@line_item = @cart.add_product(product.id)
respond_to do |format|
if @line_item.save
format.html { redirect_to store_url(product.store), notice: 'Line item was successfully created.' }
format.js { @current_item = @line_item }
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
并且Cart模型上的add_product
方法如下所示:
def add_product(product_id)
current_item = line_items.find_by(product_id: product_id)
if current_item
current_item.quantity += 1
else
current_item = line_items.build(product_id: product_id)
end
current_item
end
现在这很好用,但我希望用户能够在不同的属性之间进行选择。我的line_item
目前存储了product_id
和cart_id
,并且因为一个产品可能有多个属性,所以我继续创建了一个名为line_item_attributes
的新模型像这样:
class LineItemAttribute < ApplicationRecord
belongs_to :line_item
belongs_to :product_attribute
end
现在我可以显示具有不同产品属性的表单:
<%= simple_form_for @line_item do |f| %>
<% @attribute_categories.each do |category| %>
<%= f.simple_fields_for :line_item_attributes do |attributes_form| %>
<%= attributes_form.association :product_attribute, collection: category.product_attributes, label: category.name %>
<% end %>
<% end %>
<% end %>
我的控制器操作如下:
def new
@product = Product.find(params[:product_id])
@attribute_categories = @product.attribute_categories
@line_item = LineItem.new
@line_item.line_item_attributes.build
respond_to do |format|
format.js
end
end
和我的new.js.erb
基本上显示包含表单的模式:
$('body').append("<%= escape_javascript render('line_items/new_modal') %>");
$('#product-modal').modal('show');
现在我想知道,如何重写add_product
方法以保存指定的嵌套属性,这样我就可以创建它们。