1

我正在通过 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(只创建了一条记录)?

4

1 回答 1

1

if您对ruby​​ 语句的假设是不正确的。他们实际上可以执行代码。

def return_true
  puts 'inside method'
  true
end

if return_true
  puts "it ran some code"
end

# output will be:
# inside method
# it ran some code

在您的第二个示例中,保存至少运行一次。如果结果@as.save是真实的,那么它会第二次运行。如果它正在通过if分支的第一部分,那么其他东西会阻止它两次保存到数据库中,但没有足够的信息让我说出原因。可能是你有一个独特的约束。尝试做@ad.save!。如果有任何验证错误,bang 版本将抛出错误。

于 2012-07-11T00:37:17.360 回答