Ошибка mongoid.update_attributes для нового встроенного объекта - PullRequest
0 голосов
/ 02 ноября 2011

Я пытаюсь создать новый встроенный объект с update_attributes от его родителя.В mongoid 2.0.0.beta20 это работало нормально, но после обновления до 2.3.3 это не удалось.

Для воспроизведения можно использовать следующую структуру модели:

class Bird
  include Mongoid::Document
  embeds_one :egg
  accepts_nested_attributes_for :egg
end

class Egg
  include Mongoid::Document
  field :weight, :type => Integer, :default => 10
  field :size, :type => Array, :default => [10,10]

  def height=(value)
    self.size[0] = value
  end

  def width=(value)
    self.size[1] = value
  end

  def height
    self.size[0]
  end

  def width
    self.size[1]
  end

end

Затем выполните командув консоли ruby:

b = Bird.new
 => #<Bird _id: 4eb163660d996a3e43000002, _type: nil>
b.update_attributes "egg" => { "height" => 20, "weight" => 20 }
NoMethodError: You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.[]=
from (irb):14:in `height='
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes/processing.rb:98:in `process_attribute'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes/processing.rb:26:in `block in process'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes/processing.rb:24:in `each_pair'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes/processing.rb:24:in `process'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/document.rb:131:in `block in initialize'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/threaded/lifecycle.rb:84:in `_building'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/document.rb:127:in `initialize'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/factory.rb:23:in `new'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/factory.rb:23:in `build'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/relations/builders/nested_attributes/one.rb:30:in `build'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes/processing.rb:137:in `block in process_relations'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes/processing.rb:134:in `each_pair'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes/processing.rb:134:in `process_relations'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes/processing.rb:122:in `process_pending'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes/processing.rb:29:in `process'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes.rb:133:in `block in assign_attributes'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/threaded/lifecycle.rb:26:in `_assigning'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes.rb:132:in `assign_attributes'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/attributes.rb:154:in `write_attributes'
from vendor/ruby/1.9.1/gems/mongoid-2.3.3/lib/mongoid/persistence.rb:115:in `update_attributes'
from (irb):36
from vendor/ruby/1.9.1/gems/railties-3.1.1/lib/rails/commands/console.rb:45:in `start'
from vendor/ruby/1.9.1/gems/railties-3.1.1/lib/rails/commands/console.rb:8:in `start'
from vendor/ruby/1.9.1/gems/railties-3.1.1/lib/rails/commands.rb:40:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'system :037 > 

Это связано с тем, что встроенный объект не инициализируется до установки новых значений.Вот почему массив размеров не инициализируется и поэтому все еще равен нулю.С помощью mongoid-2.0.0.beta20 (с которого я обновляюсь) все отлично работает.Я что-то скучаю?Ожидает ли новый mongo-2.3.3, что я сначала инициализирую внедренный объект!?

Спасибо за любую помощь | подсказка.

1 Ответ

1 голос
/ 08 ноября 2011

Значения по умолчанию теперь применяются после того, как установлены все остальные атрибуты, на случай, если в качестве значения по умолчанию вы используете proc, который условно зависит от других.Ваш рост = и ширина = методы должны знать об этом сейчас.

См .:

https://github.com/mongoid/mongoid/issues/1075

...