Rails 3 принимает форму_nested_attributes_for для новой модели (вместо полной коллекции)

У меня есть модельный альбом с ассоциацией "has_many: trough" с именем Track. По сути, в альбоме может быть несколько треков, но трек может принадлежать более чем одному альбому одновременно (отсюда сквозная ассоциация «Список треков»).

У меня есть приложение RESTful с формой (с помощью formtastic), которая выводит все атрибуты дорожек, например

form.semantic_fields_for :tracks do | builder |
    builder.fields
end

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

Теперь я хочу иметь другое представление, чтобы добавить новый трек в существующий альбом. В этом представлении я не хочу отображать все поля ввода для существующих треков, а только поля для одной новой ассоциации, которую я пытаюсь создать.

Я попытался найти информацию о том, как это сделать, и лучшее, что я придумал, это:

form.semantic_fields_for :tracks, Track.new do | builder | 
    builder.fields
end

Это выводит один набор входных данных Track, если это необходимо, и я могу отправить форму, и трек будет создан и связан с продуктом, но только если нет ошибок проверки.

Проблема возникает с проверками. В случае сбоя приложение снова отображает то же представление, но все входные данные снова пусты (все данные, действительные или нет, теряются, а встроенные сообщения об ошибках для Formtastic также исчезают):

 form.semantic_fields_for :tracks, Track.new do | builder | 
        builder.fields
 end

Я думаю, это потому, что я делаю Track.new, хотя в параметрах запроса уже есть объект, который имеет данные и сообщения об ошибках. Это нехорошо конечно. Что я хочу, так это форму для отдельной дорожки, отображаемую с уже введенными данными, а также сообщения об ошибках Formtastic.

Что я делаю неправильно?


person TigerBlood    schedule 04.03.2011    source источник


Ответы (2)


Вместо

Track.new

вам нужно настроить

@track = @album.tracks.build

в вашем контроллере и используйте его. Это должно сохранить поля через ошибки проверки.

person Srdjan Pejic    schedule 04.03.2011

Я нашел решение. Это работает, но мне интересно, хорошее ли это решение. Спасибо, Срджан, за то, что поставил меня на правильный путь!

@track = @album.tracks.build

form.semantic_fields_for :tracks, @track do | builder | 
   builder.fields if builder.object.new_record?
end

По-видимому, отображает только поля формы новой записи.

person TigerBlood    schedule 04.03.2011