2014-04-14 18 views
8

Yaklaşan olaylar hakkında bilgi oluşturmak ve görüntülemek için hafif bir uygulama oluşturuyorum. Bir args karma değerini parametre olarak alan bir Event sınıfım var. Başlatma yöntemi aşağıda tanımlanmıştır.Ruby: Class.new, raylar konsolunda "Class not initialized" hatası veriyor

class Event < ActiveRecord::Base 

    def initialize(args={}) 
    @what  = args[:what] 
    @theme  = args[:theme] 
    ... 
    end 
end 

Buraya kadar her şey iyi. Ardından, Rails Console'da bir args karma tanımladım ve bir Event örneğini oluşturmaya çalışıyorum ancak aşağıdaki hatayı aldım.

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

Bu gerçekten basit gibi gözüküyor ama bunu anlamakta zorlanıyorum. Herhangi bir yardım takdir edilir. Eğer ActiveRecord devralmasını sınıflar için bir def initialize blok yapmak istiyorsanız

+0

Bu konuyla ilgili midir? http://stackoverflow.com/questions/11945070/how-do-i-initialize-an-model-object-in-ror – Amadan

+0

Hayır, sınıf için varsayılan başlangıç ​​değerlerine ihtiyacım yok. Aşağıdaki AR yanıtı aradığım şeydi. – darkmoves

cevap

12

, sen alt sınıfının düzgün başlatılmasını mümkün için sırayla bu bloğun içine super(args) aramak zorunda.

Ancak, modelinizde sütun olarak what ve theme varsa, başlatma yöntemine gerek yoktur: Event.new(args) kutunun dışında iyi çalışır.

İyi bir uygulama, ActiveRecord şemanınızda olmayan değişkenleri tanımlamanız gerektiğinde yalnızca initialize bloğunu kullanmak olacaktır (örn. Kalıcılık gerektirmeyen örnek değişkenlerini ayarlama), ancak bunu yapmanız gerekiyorsa attr_accessor'u kullanmak için daha yaygın uygulama.

+1

Bu mantıklı. Basit bir şey kaçırdığımı biliyordum. Yani, hata mesajının daha açıklayıcı olması iyi olurdu. – darkmoves

+2

Bu cevabın yarısı yanlış. Gerçekten, bir AR-devretme sınıfı üzerinde bir 'def 'başlatma yapamazsınız; ancak, çocuk sınıfının düzgün bir şekilde başlatılması için başlangıç ​​bloğundaki 'super (args)' i çağırmanız gerekecektir. Eğer sütunlar zaten bir "initialize" bloğu ile uğraşmak için gerek yok eğer, sütunlar konusunda haklı. –

+1

@JordanBecker iyi bir nokta, düzenleme için teşekkürler. Alternatif olarak 'attr_accessor' kullanımı hakkında onay verdim ve ekledim. – SteveTurczyn