アイデア:
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)見つかったAdditionalFieldsを繰り返し処理し、必要に応じて正しいフィールドタイプを作成することができます。
私はこのソリューションを比較サイトで使用しました。ここでは、それぞれ異なる比較タイプのアンケートを設定する必要がありました。
私が使用したレンダリングコードは、あなたの状況に合わせて修正する必要があります。 関係です:
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
提出されたデータをどのように保存しましたか? – Uzbekjon
user_answersテーブルを作成して保存しました。 'belongs_to:user;を持つ' UserAnswer' belongs_to AdditionalField; 'user_id、additional_field_id、answer_value'のフィールド – TomDunning
uzbekjon - 私が行ったプロジェクトに使用したコードを追加しました。それが意味をなさない場合は、もっとお気軽にお問い合わせください。 – TomDunning