Некоторые подсказки:
Кажется, что нет элемента blank_question, куда можно вставить визуализированный HTML. Возможно, вы захотите вставить в родительский элемент:
update_page do |page|
page['parent'].insert_html :bottom, :partial => 'blank_question',
:object => @survey.questions.build
end
Или, что еще проще, пусть Rails решит, какую часть использовать:
update_page {|page| page['parent'].insert_html :bottom, @survey.questions.build }
Это попытается использовать «_question.html.erb», передавая пустой вопрос, уже связанный с вашим опросом, в качестве локальной переменной «вопрос», плюс вы можете поделиться частями для отображения существующих и новых вопросов (см. Ниже).
Кстати: посмотрите, как вы можете напрямую пропустить вызов для рендеринга (и позволить Rails создать пустой вопрос для вашего опроса).
Другое КСТАТИ: Вы можете передать коллекцию в fields_for
примерно так (и она автоматически зациклится на ней, и вы можете пропустить цикл for):
survey_form.fields_for :questions do |f|
#...
end
Однако, это работает, только если ваш class Survey; has_many :questions
. Но это, наверное, так. fields_for
используемый в родительской форме также поддерживает новые объекты, которых еще нет в базе данных - это может быть полезно для вас (так называемый "blank_question"). Также вы можете просто использовать form_for @survey do |survey_form|
. Rails будет достаточно умен, чтобы использовать обновление или создавать URL в зависимости от того, находится объект в базе данных или нет. Для этого Rails использует метод new_record?
.
Приложение к вышеприведенному - чтобы поделиться частями, затем используйте:
survey_form.fields_for :questions {|f| render f.object }
Это выдаст «_question.html.erb» для каждого члена коллекции.
Обычно я использую помощника для рендеринга таких вложенных форм:
module SurveysHelper
def setup_survey(s)
# add empty question to survey if none associated
s.questions.build unless s.questions.size > 0
return s
end
end
и в представлении:
form_for setup_survey(@survey) do |survey|
survey.fields_for :questions {|f| render f.object }
end