mongoid сохранить вложенные документы - PullRequest
1 голос
/ 11 ноября 2011

Я пытаюсь использовать следующий урок от Railscast: http://railscasts.com/episodes/196-nested-model-form-part-1

Я пытаюсь заставить все работать с mongodb и mongoid.

сценарий такой: Я хочу создавать события, связанные с местоположением. Каждое событие (урок танцев) содержит много уроков. Поэтому я подумал, что встроенные отношения будут идеальными.

Вот мои модели

модель Урок

class Lesson
  include Mongoid::Document
  include Mongoid::Slug
  field :name, :type => String

  embedded_in :event

  slug :name
end

модель Event

class Event
  include Mongoid::Document
  include Mongoid::Slug
  include Mongoid::Timestamps
  include Mongoid::MultiParameterAttributes

  field :name, :type => String
  field :description, :type => String
  field :date, :type => DateTime

  validates_presence_of :name

  has_one :venue
  referenced_in :venue
  embeds_many :lessons

  slug :name 
end

модель Место проведения

class Venue
  include Mongoid::Document
  include Mongoid::Slug
  include Mongoid::Timestamps
  include Mongoid::MultiParameterAttributes


  field :name, :type => String
  field :location, :type => String

  validates_presence_of :name, :location

  belongs_to :event

  slug :name
end

контроллер событий

def create
  @event = Event.new(params[:event])
    if @event.save
    flash[:notice] = 'Event was successfully created.'
  end
 respond_with(@Event, :location => events_url)
end

def update
  # @event = Event.find(params[:id])
   @event = Event.find_by_slug(params[:id])
   if @event.update_attributes(params[:event])
      flash[:notice] = "Event was succesfully updated"
    end
  respond_with(@event)
end

Тогда у меня есть представление событий, где я могу создавать события и связывать их с местом проведения. Но я хотел бы научиться создавать уроки из представления / модели событий.

поэтому я использовал fields_for, чтобы сгенерировать поле, связанное с моделью Уроки.

= form_for @event do |f|
  .field
    = f.label :name
    %br/
    = f.text_field :name
  .field
    = f.label :description
    %br/
    = f.text_area :description
  .field
    = f.label :venue_id
    %br/
    = f.collection_select :venue_id, Venue.all, :id, :name
  .field
    = f.label :date
    %br/
    = f.datetime_select :date
  %h3 Add a Class
    = f.fields_for :lessons do |builder|
     = render "lesson_fields", :f => builder
 .actions
    = f.submit 'Save'

Когда я создаю или редактирую новое событие, я получаю сообщение об ошибке:

undefined method `extract_id' for "test":String

Но в сообщении с параметром запроса на странице ошибки отображается значение моих уроков в документе события.

"lessons"=>{"name"=>"test name lesson"}

Когда я удаляю строку fields_for, все работает нормально. Но тогда я не знаю, как сохранить значение для вложенных документов.

Ответы [ 4 ]

1 голос
/ 14 июля 2013

У меня та же проблема с embeds_many, но когда я пытаюсь изменить на has_many.Оно работает!.Может быть, вы тоже можете попробовать.

0 голосов
/ 24 ноября 2015

Пожалуйста, включите следующий код в модель event.rb

**accepts_nested_attributes_for :lessons**

Это решит вашу проблему

0 голосов
/ 13 ноября 2011

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

: (*

0 голосов
/ 11 ноября 2011
  • Вы можете опубликовать точный код, который вы используете для создания события, включая параметры?

  • какую версию Mongoid и Rails вы используете?

Первое, что я заметил, это то, что хэш следующего параметра не соответствует вашей модели уроков:

"lessons"=>{"content"=>"test name lesson"}   # this looks wrong

это должно быть:

"lessons"=>{"name" => "test name lesson"}

Похоже, что ваша форма урока имеет неправильную метку для поля ввода текста .. она должна быть: name , not: content


Чтобы высушить вещи, вы можете попробовать , если камень 'nested_form' работает для вас:

после установки драгоценного камня, используйте nested_form_for вместо form_for в вашем представлении.

Проверьте здесь для более подробного описания:

Как я могу справиться с этим типоммногоуровневые формы в рельсах

См .:

https://github.com/ryanb/nested_form (на него также ссылается упомянутый вами RailsCast)


Вы также можетехочу проверить это:

field_for и вложенная форма с mongoid

...