我正在通过 Head First Rails 工作,遇到了一些让我有点困惑的代码。代码的目标是检查并查看在创建新记录时是否出现任何错误。如果出现错误,则目标是重新显示页面。如果没有错误,目标是将记录保存到数据库中。这是本书给出的控制器代码:
def create
@ad = Ad.new(params[:ad])
if @ad.save
redirect_to "/ads/#{@ad.id}"
else
render :template => "ads/new"
end
end
这段代码唯一让我感到困惑的是这一行(如果@ad.save)。现在,我知道这条线正在测试是否有错误。如果有,则返回 false,如果没有,则返回 true。但是,我注意到如果不存在错误(它返回 true),则实际上保存了记录。我认为 ruby 中的“if”语句只是测试了一个条件,但在这种情况下,条件正在被测试和执行。奇怪的是,如果我添加另一个 @ad.save,数据库不会两次保存记录。像这样:
def create
@ad = Ad.new(params[:ad])
if @ad.save
@ad.save
redirect_to "/ads/#{@ad.id}"
else
render :template => "ads/new"
end
end
这段代码的作用与第一段代码完全相同。为什么在第一段代码中执行了@ad.save,而第二段代码中为什么没有执行两次@ad.save(只创建了一条记录)?