1

为什么第一个代码(带有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
4

3 回答 3

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' 设置为方法本身,而不是在这种情况下调用它的实例,所以它不会工作。

于 2013-08-26T19:55:51.743 回答
1

在第二种情况下,解释器将category_uri = ...其视为局部变量赋值。这就是为什么如果你想调用 setter 方法(带有尾随的方法=),你必须使用self.

于 2013-08-26T15:27:02.387 回答
0

Marek 已经说过第二个不起作用的原因。

这两段代码都不擅长这个操作属性的目的。更好地使用write_attribute以消除混淆。

我的重构建议

def set_uri
  write_attribute(:category_uri, category_uri.join('-').downcase)
  save!
end
于 2013-08-26T15:44:59.177 回答