Ruby/RoR:通过super()调用原始方法?

fea*_*ool 14 ruby ruby-on-rails

在RoR应用程序中,我想在我的一个模型中专门化ActiveRecord的update_attributes()方法,提取一些特殊处理的属性,并将其余属性传递给原始的update_attributes()方法.细节:

class Premise < ActiveRecord::Base
  ...
  def update_attributes(attrs)
    attrs.each_pair do |key, val|
      unless has_attribute?(key)
        do_special_processing(key, val)
        attrs.delete(key)
      end
    end
    # use original update_attributes() to process non-special pairs
    super.update_attributes(attrs)
  end
  ...
end
Run Code Online (Sandbox Code Playgroud)

对super.update_attributes(attr)的调用引发了一个错误:

undefined method `update_attributes' for true:TrueClass
Run Code Online (Sandbox Code Playgroud)

...这让我怀疑我真的不理解Ruby中的super关键字.我错过了什么?具体来说,我如何调用原始的update_attributes()方法?

jac*_*aco 42

在Ruby中,super是一个特殊情况,其中括号确实很重要......

调用super没有在子类中的方法参数(括号也不)调用超类中同样的方法(或其祖先如果超没有定义的话)与传递到子类方法的所有参数.所以,在这里,你可以写简单超级.

调用super()不带任何参数的超类(或祖先)方法(假设此方法不接受任何参数......)

调用super(...)与参数的任意组合调用父类的方法,向它传递PARAMATERS


DSi*_*mon 17

你要:

super(attrs)
Run Code Online (Sandbox Code Playgroud)

这将调用原始方法,将attrs作为参数传递给它.

就像现在一样,您正在尝试在原始update_attributes返回的"true"值上调用update_attributes.

  • 在这种情况下,`update_attributes(attrs)`和`super(attrs)`的参数是相同的.你可以简单地调用`super`,没有括号. (5认同)