Ruby on rails RubyonRails更新现有行项目

Ruby on rails RubyonRails更新现有行项目,ruby-on-rails,ruby-on-rails-3,ruby-on-rails-4,associations,model-associations,Ruby On Rails,Ruby On Rails 3,Ruby On Rails 4,Associations,Model Associations,我已经用模型和关联构建了一个电子商务网站 在每个用户独有的购物车模型和带有数量字段的各种产品的产品模型之间,我有一个行项目模型,该模型在用户每次添加产品和所需数量时生成一条记录。然后,新生成的行项目与特定于当前正在会话中的用户的购物车ID相关联 我目前面临的问题是,当用户试图向购物车添加更多现有产品时。由于“我的代码”当前处于高位,因此每次用户添加同一产品时,都会生成一个新的行项目,即使要添加的产品已经具有以前生成的行项目 如何修改表单代码以识别现有行项目是否包含要添加的产品并更新该行项目数量,

我已经用模型和关联构建了一个电子商务网站

在每个用户独有的购物车模型和带有数量字段的各种产品的产品模型之间,我有一个行项目模型,该模型在用户每次添加产品和所需数量时生成一条记录。然后,新生成的行项目与特定于当前正在会话中的用户的购物车ID相关联

我目前面临的问题是,当用户试图向购物车添加更多现有产品时。由于“我的代码”当前处于高位,因此每次用户添加同一产品时,都会生成一个新的行项目,即使要添加的产品已经具有以前生成的行项目

如何修改表单代码以识别现有行项目是否包含要添加的产品并更新该行项目数量,而不是创建新的行项目。我猜它包含某种IF逻辑和对行项控制器的修改,但是我就是他们所说的noob

<%= form_for [@product, LineItem.new] do |f|%>
<%= f.label :quantity %>
<%= f.text_field :quantity, class:"form-control" %>
<%= f.submit 'Add' %>
<% end %>
在控制器中:

if params[:line_item_id].present?
  @line_item = LineItem.find(params[:line_item_id])
else
  @line_item = LineItem.new
end
并将视图中的LineItem.new更改为@line_item

显然,您需要确保用户能够访问所述行项目——无论是通过他们的购物车/订单还是其他方式


需要注意的是,如果表单是现有的行项目,Rails将负责将表单指向控制器的更新操作,如果表单是新的行项目,Rails将负责创建该表单。

如果每个行项目记录在每次表单提交后都存储在数据库中,则您将在作为提交目标的控制器操作中处理该操作。差不多

line_item = LineItem.where(product:params[:product_id], cart_id:session[:cart_id]).first

if line_item
  line_item.update_attributes(quantity: line_item.quantity + params[:quantity].to_i)
else
  LineItem.create(.... #existing code
end

应该注意的是,您还可以使用LineItem.find_或_initialize_byid:params[:line_item_id]-如果为nil,它将简单地返回一个新对象。