Ruby:Class.new在rails控制台中给出"Class not initialized"错误

dar*_*ves 9 ruby ruby-on-rails

我正在创建一个轻量级应用程序来创建和显示即将发生的事件的信息.我定义了一个Event类,它将args hash作为参数.初始化方法定义如下.

class Event < ActiveRecord::Base

  def initialize(args={})
    @what       = args[:what]
    @theme      = args[:theme]
    ... 
  end
end
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.然后,在Rails控制台中,我定义了一个args哈希,并尝试创建一个Event实例,但得到以下错误.

[4] pry(main)> args = {what: 'what', theme: 'theme'}
=> {:what=>"what", :theme=>"theme"}
[5] pry(main)> Event.new(args)
=> #<Event not initialized>
Run Code Online (Sandbox Code Playgroud)

这看起来非常简单,但我无法搞清楚.任何帮助表示赞赏.

Ste*_*zyn 16

如果要def initialize为ActiveRecord继承类执行块,则必须super(args)在此块内调用,以便正确初始化子类.

但是,如果what并且theme已经作为模型中的列存在,则不需要initialize方法:Event.new(args)将立即正常工作.

一个好的做法是只initialize在需要定义ActiveRecord模式中不存在的变量时才使用块(例如,设置不需要持久性的实例变量),但是如果你需要这样做,那么这是更常见的做法attr_accessor.

  • 这个答案的一半是错误的.你确实可以在AR继承类上做一个`def initialize`; 但是你需要在初始化块中调用`super(args)`,以便正确初始化子类.对于列,Steve是正确的,如果它们已经存在,则无需使用`initialize`块. (3认同)