2010-12-06 110 views
0

我試圖初始化一個類變量作爲哈希當我創建一個SomeClass的實例但我不斷收到錯誤。有點新紅寶石,所以任何幫助,將不勝感激。感謝創建實例時初始化一個哈希變量

class SomeClass < ActiveRecord::Base 
    attr_accessible :some_hash 
    serialize :some_hash, Hash 

    def initialize(args = {}) 
    @some_hash != {} 
    end 
end 

NoMethodError:未定義的方法has_key?' for nil:NilClass from /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.3.8/lib/active_support/whiny_nil.rb:52:in method_missing的」
從/opt/local/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2827:in has_attribute?'
from /opt/local/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2888:in
檢查 '
從/opt/local/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2887:in collect'
from /opt/local/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2887:in
檢查'
從的/ opt/local/lib目錄/ruby/1.8/irb.rb:310:in output_value'
from /opt/local/lib/ruby/1.8/irb.rb:159:in
eval_input'
from /opt/local/lib/ruby/1.8/irb.rb:271:in signal_status'
from /opt/local/lib/ruby/1.8/irb.rb:155:in
eval_input'
從/opt/local/lib/ruby/1.8/irb.rb:154:in eval_input'
from /opt/local/lib/ruby/1.8/irb.rb:71:in
開始從
'從/opt/local/lib/ruby/1.8/irb.rb:70:in catch'
from /opt/local/lib/ruby/1.8/irb.rb:70:in
開始
'/opt/local/bin/irb:13

回答

2

This article should help you。

在Ruby中,你可以很容易地覆蓋通過簡單地重新定義方法(「猴子補丁」)

這是#initialize方法,你在寫現有的從寶石代碼:

# active_record/base.rb 
    def initialize(attributes = nil) 
    @attributes = attributes_from_column_definition 
    @attributes_cache = {} 
    @new_record = true 
    @readonly = false 
    @destroyed = false 
    @marked_for_destruction = false 
    @previously_changed = {} 
    @changed_attributes = {} 

    ensure_proper_type 

    populate_with_current_scope_attributes 
    self.attributes = attributes unless attributes.nil? 

    result = yield self if block_given? 
    _run_initialize_callbacks 
    result 
    end