0

这让我很困惑。我仍然是 Rails 的新手,所以它可能很简单。

情况:

  1. 我可以将商品添加到购物车,没问题。一切正常, current_cart 方法在每个请求中解析为同一个购物车。
  2. 但是,一旦我从购物车中删除了一个订单项,它就会起作用,该订单项被删除,但是
    变量“session [:cart_id]”变为空,并且
    在下次调用 current_cart 时创建了一个新的购物车。

我正在使用设计,所以我不确定这是否与它有关,或者行项目删除方法可能是级联删除会话或类似的东西。

问题是,谁能帮我理解为什么在调用 line_item delete 后会话变量变为空?

我创建了一个购物车应用程序,以及使用 Rails 进行敏捷 Web 开发。首先,这是应用程序控制器检索当前购物车的代码:

  private
  def current_cart 
    Checkout::Cart.find(session[:cart_id])
  rescue ActiveRecord::RecordNotFound 
    cart = Checkout::Cart.create 
    session[:cart_id] = cart.id
    cart
  end

现在是我的订单项控制器的代码

类 Checkout::LineItemsController < ApplicationController

# POST /checkout/line_items # POST /checkout/line_items.json def create

@cart = current_cart
product = Catalog::Product.find(params[:product_id])
apparel_event_log.info (product.to_json)


@checkout_line_item = @cart.line_items.find_or_initialize_by_sku_id(product.part_number)
new_quantity = @checkout_line_item.quantity || 0
@checkout_line_item.quantity = new_quantity+1
@checkout_line_item.line_item_description = product.name
@checkout_line_item.image = product.primary_image

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

# DELETE /checkout/line_items/1 # DELETE /checkout/line_items/1.json def destroy Checkout::LineItem.delete(params[:id])

respond_to do |format|
  format.html { redirect_to current_cart, notice: 'Line item removed.' }
  format.json { head :no_content }
end   end end

以及订单项模型的代码

class Checkout::LineItem < ActiveRecord::Base
  before_save :default_values

  attr_accessible :customer_update_date, :inventory_status, :line_item_color, :line_item_description, :line_item_size, :line_item_tagline, :line_item_total, :image, :quantity, :sku_id, :style_id, :tax, :tax_code, :timestamps, :unit_price, :cart, :product
  belongs_to :cart
  belongs_to :product, :class_name => 'Catalog::Product'
  has_one :image, :class_name => 'Assets::Medium'

  def default_values
     Rails.logger.debug { "Entering default values" }
     self.quantity ||= 0
   end

end
4

2 回答 2

1

好的,我现在实际上设法解决了这个问题。那太难了!

使用 link_to ... :destroy 或 delete 似乎是某种问题,我认为默认的 rails 代码没有产生 CSRF 保护,因此使会话无效。

我已经解决了主要部分,将 link_to 替换为 button_to 以删除行项目,这似乎是有效的,至少在功能上是这样。

我真的更喜欢使用链接而不是按钮。这似乎是一个更常见的问题,因此我会在论坛中寻找答案,但如果您知道答案,请直接在此线程上发布链接或答案,不胜感激。

于 2012-11-02T23:16:03.240 回答
0

首先,您应该将逻辑移动到模型中:

class Cart << AR
  def add(product_id)
    product = Catalog::Product.find(product_id)

    if item = self.line_items.find_or_initialize_by_sku_id(product.part_number)
      item.quantity = (item.quantity || 0) + 1
      item.line_item_description = product.name
      item.image = product.primary_image
      return item.save
    end
  end
end


class Checkout::LineItemsController < ApplicationController
    # POST /checkout/line_items # POST /checkout/line_items.json def create

    @cart = current_cart
    apparel_event_log.info (product.to_json)

    respond_to do |format|
      if @checkout_line_item = @cart.add(params[:product_id])
        format.html { redirect_to @checkout_line_item.cart, notice: 'Line item was successfully created.' }
        format.json { render json: @checkout_line_item, status: :created, location: @checkout_line_item }
      else
        format.html { render action: "new" }
        format.json { render json: @checkout_line_item.errors, status: :unprocessable_entity }
      end
    end   
end

其次,您应该添加开头:

  private
  def current_cart 
    begin
      Checkout::Cart.find(session[:cart_id])
    rescue ActiveRecord::RecordNotFound 
      cart = Checkout::Cart.create 
      session[:cart_id] = cart.id
      cart
    end
  end
于 2012-11-01T23:08:05.547 回答