我对在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,但它并没有真正解释为什么第三种情况不会起作用。
非常感谢。
答案 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