0

レールで簡単なショッピングカートを作成しています。カートに商品を追加すると、次のエラーが発生します。予期しないオブジェクトがあります。

カートに追加する方法は次のとおりです。

  def add_to_cart  
    begin
      product = Product.find(params[:id])
    rescue ActiveRecord::RecordNotFound
      logger.error("Attemp to access invalid product #{params[:id]}")
      flash[:notice] = "Invalid Product !"
      redirect_to :action => :index
    else
      @cart = find_cart     
      @cart.add_product(product)
    end
  end

カート内のadd_product:

  def add_product(product)
    current_item = @items.find {|item| item.product == product}
    if current_item
      current_item.increment_quantity
    else
      @items << CartItem.new(product)
    end    
  end

カートは正しく機能していました。add_to_cartにrescueメソッドを追加すると、これが発生しました...

4

3 に答える 3

0

次のirbテストが示すように、これはスコープの問題ではないと推測します。

irb(main):001:0> begin
irb(main):002:1* product = 'abc'
irb(main):003:1> rescue Exception => ex
irb(main):004:1> nil
irb(main):005:1> else
irb(main):006:1* puts product.inspect
irb(main):007:1> end

これを理解するための最良の方法であるIMOは、を使用して、検索の直後に製品に何が含まれているかを確認することLOGGER.debug "product now contains #{product.inspect}"です。

バックトレースも情報提供になります。この時点で、通訳が何について不平を言っているかを言うのは難しいです。製品がゼロである可能性がありますが、同じように簡単に、@cartまたはビューで参照されているものである可能性があります。

于 2009-09-14T21:02:34.077 に答える
0

add_product メソッドの @items はどのように定義されていますか? どこにも見えない、あれ?

于 2009-09-17T12:32:21.037 に答える
0

製品変数がローカルになるように、begin が新しいスコープを開始する可能性があります。そして、製品をレスキュー ブロックに追加すると、それは Nil の新しいローカルになります。

この理論をテストするproduct = nilには、コード全体の開始前にレスキュー ブロックを追加するだけです

于 2009-09-14T08:52:19.203 に答える