在rails模型中引用实例变量

时间:2016-07-18 20:41:41

标签: ruby-on-rails ruby ruby-on-rails-4

我对在rails模型中访问实例变量的不同方法感到困惑。例如,这将起作用:

def add_calories(ingredient)


    self.total_calories += ingredient.calories

    p total_calories

end

然而,这会导致错误:

def add_calories(ingredient)

    total_calories += ingredient.calories

end



Error: NoMethodError: undefined method "+" for nil:NilClass

这也不会起作用。

def add_calories(ingredient)

    total_calories = total_calories + ingredient.calories

end

如果我可以在第一种情况下访问不带self的实例变量,那么在第二种情况下,total_calories如何变为nil?

可能是total_calories的默认值设置为0吗?但是,如果是这样的话,为什么self.total_calories会起作用?

t.integer  "total_calories", default: 0 

我读过this post,但它并没有真正解释为什么第三种情况不会起作用。

非常感谢。

1 个答案:

答案 0 :(得分:1)

这似乎不是关于Rails中的实例变量访问的问题,更多的是关于" setter" Ruby中的方法(在您的情况下,使用total_calories=方法)。其他Stack Overflow答案(如this one)中介绍了有关setter方法需要显式self接收器的原因的信息。

总之,问题是语句total_calories = something的意图可能含糊不清:你定义一个新的局部变量还是调用setter?默认情况下,调用self.total_calories = something表示您要调用setter,而不使用self并调用total_calories = something表示您需要新的本地变量。

如果您更改方法内容以明确使用getter和setter方法,我认为您的第三个示例应该有效:

def add_calories(ingredient)
  self.total_calories = total_calories + ingredient.calories
end