为什么第一个代码( self )有效但第二个代码无效?
category_uri
是模型的属性
def set_uri
self.category_uri = self.category_uri.join('-').downcase
self.save!
end
没有自我
def set_uri
category_uri = category_uri.join('-').downcase
save!
end
答案 0 :(得分:1)
在第二种情况下,解释器将category_uri = ...
视为局部变量赋值。这就是为什么如果你想调用setter方法(尾随=
的方法),你必须使用self
。
答案 1 :(得分:1)
def set_uri
self.category_uri = self.category_uri.join('-').downcase
self.save!
end
方法'set_uri'将被调用为:instance.set_uri,因此在这种情况下,'self'被设置为调用该方法的实例。 但是在没有'self'的第二个代码中,'category_uri'实际上被视为局部变量。 实际上Ruby会不明确地将'self'设置为方法本身,而不是在这种情况下调用它的实例,所以它不会工作。
答案 2 :(得分:0)
马雷克已经说过第二次不工作的原因了。
这两段代码都不擅长操作属性。最好使用write_attribute
来消除混淆。
我的重构建议
def set_uri
write_attribute(:category_uri, category_uri.join('-').downcase)
save!
end