代码之家  ›  专栏  ›  技术社区  ›  Harish Shetty

ActiveRecord:当方法名作为符号传递时,在初始化后不调用

  •  9
  • Harish Shetty  · 技术社区  · 14 年前

    我注意到Rails不会触发 after_initialize

    下面的代码不起作用。

    class User < ActiveRecord::Base
      after_initialize :init_data
    
      def init_data
        puts "In init_data"
      end
    
    end
    

    下面的代码有效。

    class User < ActiveRecord::Base
    
      def after_initialize 
        init_data
      end
    
      def init_data
        puts "In init_data"
      end
    end
    

    有人能解释一下这种行为吗?

    附注1

    活动记录 documentation 以下是关于 初始化后 :

    Unlike all the other callbacks, after_find and after_initialize will 
    only be run if an explicit implementation is defined (def after_find). 
    In that case, all of the callback types will be called. 
    

    虽然有人说在初始化需要显式实现之后,我发现上面段落中的第二句话很模糊,即。 In that case, all of the callback types will be called. all of the call back types ?

    文档中的代码示例有一个不使用显式实现的示例:

    after_initialize EncryptionWrapper.new
    
    2 回复  |  直到 14 年前
        1
  •  7
  •   Claw    8 年前

    根据 documentation after_initialize after_find 回调:

    after\u initialize和after\u find 回调与 其他人。他们以前没有_* 通过将它们定义为 在初始化或 使用宏样式类查找后 方法,它们将被忽略。 原因,因为在初始化和 显著减缓了 查询。

    初始化后 实例方法:

    class User < ActiveRecord::Base
    
      def after_initialize
        do_stuff
      end
    
    end
    
        2
  •  0
  •   Raphomet    14 年前

    我很确定symbol调用的方法需要保护或私有。

    Rails 3 documentation :

    方法引用回调通过指定对象中可用的受保护或私有方法来工作