0

在阅读使用 Rails 进行敏捷 Web 开发一书时,我有一个快速的问题,我在浏览网站时无法找到答案。我有两种方法:

此方法在我的控制器中:

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 在模型方法中被破坏,那么该方法返回的是什么?(无?) current_item 作为变量是否仍然存在,只是数据库对象已被破坏?控制器中的递减方法如何保存已经销毁的对象?(我在控制器方法的 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 回答