0

これは私を困惑させます。私はまだRailsの初心者なので、簡単かもしれません。

状況:

  1. カートにアイテムを追加できます。問題ありません。current_cart メソッドは、リクエストごとに同じカートに解決されます。
  2. しかし、カートから品目を削除するとすぐに機能し、品目は削除されますが、
    変数「session[:cart_id]」は null になり
    、次に current_cart が呼び出されたときに新しいカートが作成されます。

私はDeviseを使用しているので、それが何か関係があるのか​​ どうかはわかりません。それとも、行項目の削除方法がセッションのカスケード削除などである可能性があります。

問題は、line_item delete を呼び出した後にセッション変数が null になる理由を理解できる人はいますか?

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

これで、広告申込情報コントローラーのコードが

class 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 に答える