after_initialize виртуальный атрибут - PullRequest
0 голосов
/ 09 ноября 2010

Я не могу присвоить значение виртуальному атрибуту в методе after_initialize:

attr_accessor :hello_world

def after_initialize
   self[:hello_world] = "hello world"
end

На мой взгляд файл:

hello world defaulted? <%= @mymodel.hello_world %>

Это не возвращает никакого вывода.
Есть ли у вас какие-либо предложения или альтернативы для установки значения по умолчанию для виртуального атрибута?

1 Ответ

4 голосов
/ 09 ноября 2010

Вы используете нечетный метод назначения в вашем обратном вызове after_initialize.Вам просто нужно присвоить self.hello_world или даже @hello_world.Ваше назначение создало хеш в вашем экземпляре класса с ключом: hello_world и значением, как и ожидалось.По вашему мнению, вы можете ссылаться на @mymodel [: hello_world], но это далеко не идиоматично.

В следующем примере модели и сеанса консоли показано влияние использования различных методов инициализации виртуального атрибута.

class Blog < ActiveRecord::Base

  attr_accessor :hello_world1, :hello_world2, :hello_world3

  def after_initialize
    self.hello_world1 = "Hello World 1"
    self[:hello_world2] = "Hello World 2"
    @hello_world3 = "Hello World 3"
  end
end


ruby-1.9.2-p0 > b=Blog.new
 => #<Blog id: nil, title: nil, content: nil, created_at: nil, updated_at: nil> 
ruby-1.9.2-p0 > b.hello_world1
 => "Hello World 1" 
ruby-1.9.2-p0 > b.hello_world3
 => "Hello World 3" 
ruby-1.9.2-p0 > b.hello_world2
 => nil 
ruby-1.9.2-p0 > b[:hello_world2]
 => "Hello World 2" 
ruby-1.9.2-p0 > b[:hello_world1]
 => nil
...