Ruby on Rails 更新现有订单项



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

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

我目前面临的问题是当用户尝试将更多现有产品添加到他们的购物车时。根据我的代码当前情况,每次用户添加相同的产品时都会生成一个新的行项,即使要添加的产品已经具有之前生成的行项。

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

<%= 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 将负责将表单指向控制器的更新操作,如果它是现有的 LineItem,或者如果它是新的 LineItem,则指向 Create。

如果在每次表单提交后将每个 LineItem 记录存储在数据库中,则您将在作为提交目标的控制器操作中处理此问题。类似的东西

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

最新更新