person.omgの中身がtrueなのは initialize メソッドがオーバーライドされて、Person.newが呼ばれたときに、インスタンス変数(@omg)にtrueが代入されているからです。
after_initialize ではありません。しかし、ActiveModelでもafter_initializeはできます。
例えばこんな感じ。
lang
1class Person
2 extend ActiveModel::Callbacks
3 define_model_callbacks :initialize, :only => :after
4 attr_accessor :id, :name, :omg
5
6 after_initialize :init_omg
7
8 def initialize(attributes={})
9 attributes.each do |key, value|
10 send("#{key}=", value)
11 end
12
13 @omg ||= true
14
15 run_callbacks :initialize do
16 self.omg = false
17 end
18 end
19
20 def attritbutes
21 return @attributes if @attributes
22 @attributes = {
23 id: id,
24 name: name
25 }
26 end
27end
after_initialize というコールバックはインスタンスが生成されたときに発火するので、Person.newでもPerson.where(name: 'bob')でも、いろんなときにコールバックが走ります。なので、結構扱いに注意しないと危険なコールバックですね。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/05/25 22:13
2015/05/26 07:07
2015/05/26 11:57
2015/05/26 12:50
2015/05/27 15:53