after_initialize虚拟属性

时间:2010-11-09 09:32:18

标签: ruby-on-rails virtual-attribute

我无法在after_initialize方法中为虚拟属性赋值:

attr_accessor :hello_world

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

在我的视图文件中:

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

这不会返回任何输出 您是否有任何建议或任何替代方法来设置虚拟属性的默认值?

1 个答案:

答案 0 :(得分:4)

您在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