如何在一个表格栏上保存很多项目?

时间:2014-12-02 17:32:23

标签: ruby ruby-on-rails-4

我需要在表单上将很多项目保存到购物车,用户输入数量一个表格,所选项目转到数据库,但现在只保存第一个输入的项目数量。为什么呢?

我的表格

<%= 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

2 个答案:

答案 0 :(得分: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,而实际上您正在寻找接受多个{{ 1}}和:item_id字段。您需要使用嵌套的has_many关联来研究Strong Parameters

最后你有了这个

:qty
当您真正尝试创建多个项目并将其关联回@cart_items = CartItem.create(cart_items_params) 时,

会尝试创建一个CartItem。您需要研究accepts_nested_attributes_for以及更常见的&#34; rails来保存Cart关联&#34;。在SO和其他地方,这是一个广泛涵盖的主题。

答案 1 :(得分: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 %>