Rails控制器Object.save

时间:2012-07-11 00:15:24

标签: ruby-on-rails ruby-on-rails-3

我正在通过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中的语句只测试了一个条件,但在这种情况下,条件正在测试和执行。奇怪的是,如果我添加另一个@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没有执行两次(只创建一条记录)?

1 个答案:

答案 0 :(得分:1)

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

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!。如果有任何验证错误,爆炸版本将抛出错误。