вложенная форма, встроенные документы, проблема mongoid 2.2.0

Кажется, я не могу найти ответ на этот вопрос здесь или в Google, любая помощь была бы потрясающей. Здание сохраняется правильно, но встроенный документ PriorityArea не обновляется ... Я хочу, чтобы в конечном итоге он получил новую форму ajax для новых приоритетных областей, но сначала нужно обновить его.

Mongoid::Errors::InvalidFind в BuildingsController#update

Вызов Document#find с нулевым значением недействителен

class Building
  include Mongoid::Document
  embeds_many :priority_areas
  accepts_nested_attributes_for :priority_areas, :allow_destroy => true, :autosave => true
end

class PriorityArea
  include Mongoid::Document
  embedded_in :building, :inverse_of => :priority_areas
end

#view

= form_for [@customer, @building] do |f|
  ...
  ...
  = f.fields_for :priority_areas do |pa|
    = f.name
    ...
    ...

#controller

@building.update_attributes(params[:building])

Он правильно выдает правильные данные из базы данных, но не выдает ошибку выше при сборке # update. Любая помощь приветствуется.


обновить в здании#update im ставит params[:building][:priority_areas_attributes].to_yaml

что дает

--- !map:ActiveSupport::HashWithIndifferentAccess 
"0": !map:ActiveSupport::HashWithIndifferentAccess 
name: area 51
location: near front door
notes: ""
priority: "1"
id: ""
"1": !map:ActiveSupport::HashWithIndifferentAccess 
name: area 52
location: near rear door
notes: ""
priority: "2"
id: ""

я предполагаю, что проблема в нулевом идентификаторе:


person Rockman    schedule 12.09.2011    source источник


Ответы (2)


Проблема заключалась в нулевом идентификаторе, необходимом для правильной работы ObjectId. глупая ошибка с моей стороны.

person Rockman    schedule 21.09.2011

Я столкнулся с точной проблемой. simple_form автоматически передавал параметр id моему контроллеру, но он был пустым.

Почему идентификатор моего встроенного документа был пустым? Я предполагаю, что это потому, что я импортировал родительский документ через mongoimport. Если я вручную создаю родительский документ через веб-формы, то встроенные документы будут иметь идентификаторы, как и ожидалось.

Вот мой обходной путь:

class Foo
  include Mongoid::Document

  embeds_many :bars
  accepts_nested_attributes_for :bars

  ####
  # simple_form_for / embedded document workaround
  #
  # Because simple_form wants to provide the ID for an existing object, 
  # it will output a blank ID because imported embedded documents
  # have an ID of nil.
  #
  # Intercept it to avoid 
  #   Mongoid::Errors::InvalidFind in FoosController#update

  def bars_attributes=(attribs)
    attribs.each do |key, value|
      index = key.to_i
      fixed_attrib = value.delete_if { |k,v| k=="id" and v=="" }
      self.bars[index].update_attributes(fixed_attrib)
    end
  end


end

class Bar
  include Mongoid::Document

  embedded_in :foo
end
person Ron    schedule 08.05.2012