我需要在表单上将很多项目保存到购物车,用户输入数量一个表格,所选项目转到数据库,但现在只保存第一个输入的项目数量。为什么呢?
我的表格
<%= 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 :(得分: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 %>