У меня есть сложная форма для модели Расписание, принадлежащее родительской модели Листинга:
class Listing < ActiveRecord::Base
has_many :schedules, :dependent => :destroy
accepts_nested_attributes_for :schedules, :allow_destroy => true, :reject_if => :all_blank
...
end
class Schedule < ActiveRecord::Base
belongs_to :listing
...
end
Из-за сложности формы расписания я не хочу отображать ее для каждого элемента в fields_forРасписания, поэтому они содержат только заголовок и ссылку для удаления (и несколько скрытых полей для других параметров).
Вместо этого сложная форма используется для асинхронной генерации новых полей формы для каждого расписания, которые затем вставляются в родительскую форму.Это просто ответ от публикуемой формы «Расписание» (с использованием частичного _new_schedule_fields), который добавляется в раздел fields_for (: schedules) в форме «Листинг».Затем дочерние расписания создаются автоматически при сохранении списка, поскольку он принимает списки расписаний accept_attributes_for.Вызов формы Schedule выглядит следующим образом (сидит после form_for листингов на странице):
form_for([@listing, @schedule], :remote => true) do |f|
Это очень хорошо работает при редактировании существующего листинга, но form_for, используемый для построения сложной формы Schedule, падаетна новых листингах:
=> No route matches {:action=>"create", :controller=>"schedules")
На моих маршрутах у меня есть (Rails 3):
resources :listings do
resources :schedules
end
Это имеет смысл, конечно, так как ожидаемый маршрут будет / Listings /: перечисление_id/ schedules / new, но мне интересно, есть ли способ использовать конструктор form_for для создания формы для вложенной модели, принадлежащей несохраненному родителю?/ Listings / new / schedule / new выглядит абсурдно, но отлично подводит итог того, что я ищу!
Благодарен за любые полезные предложения.
Редактировать:
Я должен добавить, чтоЯ создаю новые экземпляры Schedule в новых и редактирующих методах контроллера листингов, например:
def new
@listing = Listing.new
@schedule = @listing.schedules.build
end
def edit
@listing = Listing.find(params[:id])
@schedule = @listing.schedules.build
end