通过按钮更新购物车

时间:2015-10-26 15:05:06

标签: ruby-on-rails ruby-on-rails-4

我正在尝试在结帐前访问该页面,您可以在其中修改数量并相应地更新所有价格。现在我的“更新”按钮,更新“东西”,但它不是我想要实现的,它发送给我一个我甚至不想拥有的line_items显示页面(我现在保留它以避免缺少模板错误)。 rails文档对我没有帮助......无论如何,代码就是这个

<ul>
    <% @cart.line_items.each do |item| %>
        <%= form_for(item) do |f| %>
            <li><%= f.number_field :quantity, :value => item.quantity %> x <%= item.product.name %>
                <%= item.total_price %> </li>
        <% end %>
        <%= submit_tag "Update" %>
    <% end %>
    <br><strong>Total Price:</strong> <%= @cart.total_price %>
</ul>
<%= button_to "Checkout", new_order_path, method: :get, data: { confirm: "Are you sure?" } %>
<%= button_to 'Empty cart', @cart, method: :delete, data: { confirm: 'Are you sure?' } %> 
<%= link_to 'Back', categories_path %> 

谢谢!

编辑

class LineItemsController < ApplicationController
  include CurrentCart
  before_action :set_cart, only: [:create, :update, :destroy]
  before_action :set_line_item, only: [:show, :edit, :update, :destroy]

  # GET /line_items
  # GET /line_items.json
  def index
    @line_items = LineItem.all
  end

  # GET /line_items/1
  # GET /line_items/1.json
  def show
  end

  # GET /line_items/new
  def new
    @line_item = LineItem.new
  end

  # GET /line_items/1/edit
  def edit
  end

  # POST /line_items
  # POST /line_items.json
  def create
    product = Product.find(params[:product_id])
    @line_item = @cart.add_product(product.id)

    respond_to do |format|
      if @line_item.save
        format.html { redirect_to @line_item.cart, notice: 'Line item was successfully created.' }
        format.json { render :show, status: :created, location: @line_item }
      else
        format.html { render :new }
        format.json { render json: @line_item.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /line_items/1
  # PATCH/PUT /line_items/1.json
  def update
    respond_to do |format|
      if @line_item.update(line_item_params)
        format.html { redirect_to @cart, notice: 'Line item was successfully updated.' }
        format.json { render :show, status: :ok, location: @line_item }
      else
        format.html { render :edit }
        format.json { render json: @line_item.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /line_items/1
  # DELETE /line_items/1.json
  def destroy
    @line_item.destroy
    respond_to do |format|
      format.html { redirect_to line_items_url, notice: 'Line item was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_line_item
      @line_item = LineItem.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def line_item_params
      params.require(:line_item).permit(:product_id, :cart_id, :order_id)
    end

end

1 个答案:

答案 0 :(得分:1)

更新项目后只需重定向即可。并提供允许line_item_update_params参数的正确quantity方法。你的控制器应该是这样的:

class ItemsController < ApplicationController

  def update
    item = Item.find(params[:id])
    item.update(line_item_update_params)

    redirect_to :back # this is the key line of code
  end

  ...

  private

  # it is used for creating
  def line_item_params
    params.require(:line_item).permit(:product_id, :cart_id, :order_id)
  end

  # it is used for updating
  def line_item_update_params
    params.require(:line_item).permit(:quantity)
  end

  ...

end