Идея в шагах:
1) Определить модель, такую как AdditionalField (id, field_name, field_type, default_value, is_required)
2) затем создайте такую функцию, как:
def self.for_form(my_form_name = nil)
if my_form_name.nil?
self.all
else
self.find(:all, :contitions => {:form_type => my_form_name.type} # or whatever selection criteria
end
3) затем вы можете перебрать найденные дополнительные поля и при необходимости построить правильные типы полей.
Я использовал это решение для сайта сравнения, где им нужно было настроить вопросники для каждого отдельного типа сравнения.
Вот код рендеринга, который я использовал, вам нужно изменить его в соответствии с вашей ситуацией.
отношения:
convention -< booking >- user
convention -< convention_question
booking -< guests
guest -< guest_answers
QuestionsHelper
def render_guest_questions(guest, convention_question)
fields_for "booking[guest_answer_attributes][]", convention_question do |m|
case convention_question.display_type
when "Text"
'<td>' + text_field_tag("booking[guest_answer_attributes][convention_question_#{guest.id}_#{convention_question.id}]") + '</td>'
when "Boolean"
'<td>' + hidden_field_tag("booking[guest_answer_attributes][convention_question_#{guest.id}_#{convention_question.id}]", "No") + check_box_tag("booking[guest_answer_attributes][convention_question_#{guest.id}_#{convention_question.id}]", "Yes") + '</td>'
end
end
end
Контроллер
# TURN GUEST/QUESTIONS INTO guest answers
if params[:booking] && !params[:booking].blank? && !params[:booking][:guest_answer_attributes].blank?
params[:booking][:guest_answer_attributes].each do |k,v|
handle_answers(k, v)
end
end
def handle_answers(k, v)
x = k.mb_chars.split(/_/)
g_id = x[2]
q_id = x[3]
item = GuestAnswer.find_or_create_by_guest_id_and_convention_question_id(
{:guest_id => g_id,
:convention_question_id => q_id,
:answer => v})
end