Путь к вложенной модели / форме для несохраненного родителя - PullRequest
0 голосов
/ 17 июля 2010

У меня есть сложная форма для модели Расписание, принадлежащее родительской модели Листинга:

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

1 Ответ

1 голос
/ 18 июля 2010

Вы не можете использовать form_for по умолчанию, чтобы сделать внедренный объект под новым родителем, потому что у контроллера нет способа вернуть объект, который является дочерним для вашего нового объекта, так как вы не можете назначить дочерний элемент для объект без идентификатора Вы должны были бы настроить собственный маршрут. Для меня концептуально, однако, ограничение имеет смысл - вы НЕ запрашиваете приложение вернуть дочерний элемент вашего нового объекта, потому что вы не можете создать дочерний элемент до тех пор, пока не создадите объект, поэтому вы бы назвали не встроенный маршрут, просто form_for (@schedule). Затем просто верните все дерево сборки как один объект, чтобы все это сохранялось вместе. Вы должны встроить его в окончательный запрос на сохранение, пока к этому времени не будет внедренного объекта.

...