删除line_item时删除Rails会话值

时间:2012-11-01 20:14:10

标签: ruby-on-rails ruby-on-rails-3

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

情况:

  1. 我可以将商品添加到购物车,没问题。一切正常,current_cart方法解析为每个请求相同的购物车。
  2. 但是,只要我从购物车中删除订单项,它就可以了,订单项会被删除,但是 变量“session [:cart_id]”变为null,并且新购物车获得了 在下次调用current_cart时创建。
  3. 我正在使用Devise所以我不确定这是否与它有关,或者行项目删除方法是级联删除会话或类似的东西。

    问题是,在调用line_item delete之后,是否有人可以帮助我理解为什么会话变量变为空?

    我已经创建了一个购物车应用程序,以及使用rails的Agile 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
    

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

      

    class Checkout :: LineItemsController< ApplicationController中

         

    #POST / checkout / line_items #POST /checkout/line_items.json def   创建

    @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       结帐:: 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
    

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

好的,我实际上已经设法解决了这个问题。那很难!

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

我已经通过用button_to替换link_to来解决主要部分,以删除订单项,这似乎有效,至少在功能上。

我真的更喜欢使用链接而不是按钮。这似乎是一个更常见的问题,所以我会在论坛上寻找答案,但是如果你知道答案,请欣赏你是否可以直接在这个帖子上发布链接或答案。