我需要修复activerecord属性的编码,并决定在before_save钩子中执行此操作。在这一点上,我注意到了一个意想不到的特点。当我想更改属性的值时,只需使用 attribute_name=XY 没有像我预期的那样工作。而不是我需要用的 self[:attribute_name]=XY . 到目前为止我还没有意识到这种行为 AR.attribute_name=XY . 这是什么原因?这种行为与钩子或其他东西有关吗?谢谢你的解释。
attribute_name=XY
self[:attribute_name]=XY
AR.attribute_name=XY
这实际上是一个ruby“特性”:
def value=(x) p x end def run value = 123 end run # => 123
在上面的run中,doing value指定 地方的 变量,不是别的。如果要调用value=,则必须指定接收方:
def run self.value = 123 end run 123 # => nil
希望这有帮助!