【问题标题】:Ruby on Rails update existing line itemRuby on Rails 更新现有订单项
【发布时间】:2018-07-05 10:51:16
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 associations model-associations


    【解决方案1】:

    在您的控制器中:

    if params[:line_item_id].present?
      @line_item = LineItem.find(params[:line_item_id])
    else
      @line_item = LineItem.new
    end
    

    并在您的视图中将LineItem.new 更改为@line_item

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

    值得注意的是,如果表单是现有的 LineItem,Rails 将负责将表单指向控制器的更新操作,或者如果它是新的 LineItem,则指向 Create。

    【讨论】:

    • 应该注意,你也可以使用LineItem.find_or_initialize_by(id: params[:line_item_id])——如果为nil,它只会返回一个新对象。
    【解决方案2】:

    如果每个 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 2017-07-19
      • 2018-12-18
      • 1970-01-01
      • 2013-05-15
      • 2017-06-14
      • 1970-01-01
      相关资源
      最近更新 更多