2014-12-02 66 views
0

我需要將許多物品保存到購物車上,用戶輸入數量一個表單,並且所選物品轉到數據庫,但現在只保存物品的首次輸入數量。爲什麼?如何在一個表單欄上保存多個項目?

我的形式

<%= form_for @cart_item do |f| %> 
<% @category.items.each do |item| %> 
<%= item.name %> 
<%= f.hidden_field :item_id, :value => item.id %> 

<%= f.text_field :qty %> 
<% end %> 
<%= f.submit %> 
<% end %> 

和控制器 cart_items_controller.rb

class CartItemsController < ApplicationController 

    before_action :set_cart, only: [:create] 


    def create 
     @cart_items = CartItem.create(cart_items_params) 
     @cart_items.cart_id = @cart.id 
     if @cart_items.save 
     redirect_to :back 
     else 
      render root_path 
     end 
    end 

    private 

    def cart_items_params 
     params.require(:cart_item).permit(:id, :qty, :item_id, :cart_id) 
    end 

    def set_cart 
     @cart = Cart.find(session[:cart_id]) 
    rescue ActiveRecord::RecordNotFound 
     @cart = Cart.create 
     session[:cart_id] = @cart.id 
    end 

end 

回答

0

我這樣做:

def create 
     @cart_items = params[:cart_items] 
     @cart_items.each do |c| 
      @cart_item = CartItem.new(c) 
      if @cart_item.qty.present? 
       @cart_item.cart_id = @cart.id 
       @cart_item.save 
      end 
     end 

和形式

<%= form_tag cart_items_path do %> 
<% @cart_items.each do |cart_item| %> 
<%= fields_for "cart_items[]", cart_item do |f| %> 
    <% @category.items.each do |item| %> 
     <%= item.name %> 
     <%= f.hidden_field :item_id, value: item.id %> 
     <%= f.text_field :qty %> 
    <% end %> 
    <%= f.submit %> 
    <% end %> 
    <% end %> 
<% end %> 
1

這裏有幾個問題。我給你一個小凸點:

<% @category.items.each do |item| %> 
    <%= item.name %> 
    <%= f.hidden_field :item_id, :value => item.id %> 

    <%= f.text_field :qty %> 
<% end %> 

對於每個CartItem,這是要創建這樣一個輸入

<input name="qty"> 

這是有問題的,因爲只有一個(最後一個在DOM )將提交。您需要研究fields_for並將其合併到您的循環中,以獲取表格中每個Item的唯一名稱。

同樣的問題如下透進你的控制器

def cart_items_params 
    params.require(:cart_item).permit(:id, :qty, :item_id, :cart_id) 
end 

這是要去尋找一個:id:qty:item_id,並:cart_id,當在現實中你正在尋找接受多個:item_id:qty領域。你需要研究帶有嵌套has_many關聯的Strong Parameters

最後,你有這樣的

@cart_items = CartItem.create(cart_items_params) 

這是會嘗試創建一個CartItem當你真的想創建多個項目,他們回到Cart關聯。你需要研究accepts_nested_attributes_for以及更一般的「軌道形式保存has_many協會」。這是一個廣泛覆蓋主題在這裏SO和其他地方。

相關問題