2016-10-03 17 views
0

私はレール5でクイズアプリを作成しています。ユーザーはデータベースから複数の選択肢の質問を受け取ります。質問ごとに、ユーザーは単一のオプション(ラジオボタン)または複数のオプション(チェックボックス)のいずれかを選択できます。これはブール値フィールド 'multiselect'としてdbに格納されます。強力なパラメータを使用してフォームの値を入力する

私はフォームを作成するためにform_forを使用しています。コントローラで

<div class="answer-box"> 
     <% if m.object.multiselect %> 
     <%= m.collection_check_boxes :answer, m.object.options, :id, :option_text, { checked: m.object.options.first.id } %> 
     <% else %> 
     <%= m.collection_radio_buttons :answer, m.object.options, :id, :option_text, { checked: m.object.options.first.id } %> 
     <% end %> 

     <%= m.hidden_field(:question_id, value: m.object.id) %> 
     <%= m.hidden_field(:question_type, value: 'Mcq') %> 
</div> 

次のように、私はparamsハッシュを許可しました:質問は複数選択する場合

def response_params 
params.require(:quiz).permit(
    { 
    mcq_responses_attributes: [ 
     :question_id, 
     :question_type, 
     answer: [] 
    ] 
    }) 
end 

問題は、次のとおりです。答えは配列であり、それがシングルのとき選択:答えは整数です。私がしたことは、答えが:配列であるかどうかをチェックし、そうでなければ、配列に単一の整数を変換し、上記の関数を使用してそれを許可することです。

def create_answer_array 
    params[:quiz][:mcq_responses_attributes].each do |k, r| 
    r[:answer] = Array(r[:answer]) unless r[:answer].is_a? Array 
    end 
end 

これを行うより良い方法はありますか?

答えて

0

一般に、可能な限り不変な要求からパラメタと他のものを処理するのがよい方法です。

代わりに、あなただけ適用される2つのシナリオのあなたのparams衛生法で確認することができます:

def response_params 
    p = params.require(:quiz) 
    if params[:quiz][:answer].is_a? Array 
    p.permit(:question_id, :question_type, answer: []) 
    else 
    p.permit(:question_id, :question_type, :answer) 
    end 
end 
+0

私は、ネストされたのparamsを追加するために自分のコードを編集しました。あなたの答えに 'response_params'のパラメータをループさせる必要がありますか? – meris1889

関連する問題