Инициализация хеш-переменной при создании экземпляра - PullRequest
0 голосов
/ 06 декабря 2010

Я пытаюсь инициализировать переменную класса как хеш, когда создаю экземпляр 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?'<br> 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'<br> 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'<br> from /opt/local/lib/ruby/1.8/irb.rb:159:in eval_input '
из /opt/local/lib/ruby/1.8/irb.rb:271:in signal_status'<br> 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'<br> from /opt/local/lib/ruby/1.8/irb.rb:71:in start '
из /opt/local/lib/ruby/1.8/irb.rb:70:in catch'<br> from /opt/local/lib/ruby/1.8/irb.rb:70:in start '
из / opt / local / bin / irb: 13

1 Ответ

2 голосов
/ 06 декабря 2010

Эта статья должна помочь вам.

В Ruby вы можете легко перезаписать существующий код из драгоценных камней, просто переопределив метод ("monkey patching")

Thisэто метод #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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...