添加带有关联的对象到购物车

时间:2016-01-19 22:10:57

标签: ruby-on-rails

我正在开发电子商务商店,基本上我的产品可以有很多属性,从大小到颜色。

现在,我可以让用户将商品添加到购物车中。通过这样做:

<%= 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_idcart_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方法以保存指定的嵌套属性,这样我就可以创建它们。

0 个答案:

没有答案