Использование пользовательских конструкторов форм с вложенными моделями в Ruby on Rails - PullRequest
1 голос
/ 18 февраля 2011

Я использую метод вложенных моделей из Railscast 197 (ASCIIcast здесь ).Но у меня возникла проблема с моей настройкой, мне нужно использовать пользовательский конструктор форм для одной из частей моих вложенных моделей.У меня это работает, вроде как, изменяя link_to_add_fields_helper, вот так ...

def link_to_add_fields(name, f, association)  
  new_object = f.object.class.reflect_on_association(association).klass.new  
  fields = f.fields_for(association, new_object, :child_index => "new_#{association}", :builder => AnswerFormBuilder) do |builder|
  #was...
  #fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
    render(association.to_s.singularize + "_fields", :f => builder)  
  end  
  link_to_function(name, h("add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")"))  
end

Итак, вы устанавливаете обе вложенные модели в AnswerFormBuilder. Я вроде решил свою проблему, но это не очень элегантнопоскольку и Вопросы, и Ответы в них не нуждаются.Кроме того, я дошел до того, что мне бы хотелось создать конструктор форм для приложений.Это подводит меня ко второму вопросу: как я могу «вложить» конструкторы пользовательских форм?Т.е. в AnswerFormBuilder реализованы все методы, которые должен иметь ApplicationFormBuilder, а также некоторые другие специальные методы для ответов.Большое спасибо, я посмотрел везде и спросил в других блогах, но ответа пока нет.

1 Ответ

1 голос
/ 02 мая 2012

Итак, я понял это несколько месяцев спустя ...

def link_to_add_fields(name, f, association, options = {})  
  new_object = f.object.class.reflect_on_association(association).klass.new  
  fields = f.fields_for(association, new_object, :child_index => "new_#{association}", :builder => options[:builder]) do |builder|
    render(association.to_s.singularize + "_fields", :f => builder)  
  end  
  link_to_function(name, h("add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")"))  
end

Тогда, когда мне, когда мне нужен пользовательский конструктор форм, я просто вызываю pass_to_add_fields хэш с ключом: builder и значением конкретного компоновщика.

link_to_add_fields "Add Question", f, :questions, :builder => QuestionFormBuilder

Если в link_add_fields не передается хеш (или нет: пара значений ключа компоновщика), то по умолчанию для fields_for используется стандартный компоновщик форм.

...