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