0

Rails を使用したアジャイル Web 開発の本を読んでいるときに簡単な質問がありましたが、Web サイトを調べても答えを見つけることができませんでした。私には2つの方法があります:

このメソッドは私のコントローラーにあります:

def decrement
  @line_item = LineItem.find(params[:id])
  @line_item = @line_item.decrement_quantity(@line_item.id)

  respond_to do |format|
    if @line_item.save
      format.html { redirect_to store_url }
      format.json { render json: @line_item, status: :created, location: @line_item }
    else
      format.html { render action: "new" }
      format.json { render json: @line_item.errors, status: :unprocessable_entity }
    end
  end

そして、これは対応するモデルにあります:

def decrement_quantity(line_item_id)
  current_item = LineItem.find_by_id(line_item_id)

  if current_item.quantity > 1
    current_item.quantity -= 1
  else
    current_item.destroy
  end

  current_item
end

これが最も効率的なコードではないことはわかっていますが、私の質問は、 current_item がモデル メソッドで破棄された場合、そのメソッドは何を返すのでしょうか? (nil?) 変数としての current_item はまだ存在していますか? データベース オブジェクトが破棄されただけですか? コントローラの decrement メソッドは、破棄されたオブジェクトをどのように保存できますか? (コントローラーメソッドの if ステートメントに logger.debut ステートメントを入れましたが、モデルメソッドが if または else ステートメントを評価したかどうかに関係なく、コードは常にそこを通過するようです)。

4

1 に答える 1

0

モデルは呼び出し中はまだ存在しますが、データベースから削除されているため、呼び出すとcurrent_item.destroyed?true が返されます。

アイテムが破棄された場合でも、saveメソッドは true を返します。

うまくいけば役立つ端末出力を次に示します。

1.9.2p290 :001 > current_item = Deck.first
  Deck Load (0.1ms)  SELECT "decks".* FROM "decks" LIMIT 1
 => #<Deck id: 2, name: "Test Deck 1", description: "This is a te> #snip
1.9.2p290 :002 > current_item.destroyed?
 => false 
1.9.2p290 :003 > current_item.destroy
   (0.2ms)  begin transaction
  SQL (23.1ms)  DELETE FROM "decks" WHERE "decks"."id" = ?  [["id", 2]]
   (5.0ms)  commit transaction
 => #<Deck id: 2, name: "Test Deck 1", description: "This is a te> #snip
1.9.2p290 :004 > current_item.destroyed?
 => true 
1.9.2p290 :005 > current_item.save
   (0.2ms)  begin transaction
   (0.1ms)  commit transaction
 => true 
于 2012-04-27T04:29:07.600 に答える