我在浏览Agile Web Development with Rails时遇到了一个简短的问题,我在浏览网站时无法找到答案。我有两种方法:
此方法在我的控制器中:
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作为变量仍然存在,只是数据库对象被破坏了吗?控制器中的减量方法如何保存已被破坏的对象? (我在控制器方法的if语句中放了一个logger.debut语句,无论模型方法是否评估if或else语句,似乎代码总是在那里进行。)
答案 0 :(得分: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