self vs non-self in instance方法

时间:2013-08-26 15:25:18

标签: ruby-on-rails activerecord self

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

3 个答案:

答案 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