вложенная форма, встроенные документы, проблема mongoid 2.2.0 - PullRequest
3 голосов
/ 12 сентября 2011

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

Mongoid :: Ошибки :: InvalidFind в BuildingsController # update

Недопустимый вызов документа # find with nil

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. Любая помощь с благодарностью.


обновление в здании # обновление им помещает параметры [: 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: ""

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

Ответы [ 2 ]

1 голос
/ 21 сентября 2011

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

0 голосов
/ 09 мая 2012

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