0

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

attr_accessor :hello_world

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

在我的视图文件中:

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

这不会返回任何输出。
对于为虚拟属性设置默认值,您有什么建议或替代方法吗?

4

1 回答 1

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
于 2010-11-09T09:57:26.780 回答