Rails 3 принимает accept_nested_attributes_for для новой модели (вместо полной коллекции) - PullRequest
0 голосов
/ 04 марта 2011

У меня есть альбом модели, который имеет ассоциацию 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

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

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

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

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

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 04 марта 2011

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

@track = @album.tracks.build

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

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

0 голосов
/ 04 марта 2011

вместо

Track.new

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

@track = @album.tracks.build

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

...