2016-10-03 52 views
0

我正在用rails 5寫一個測驗應用程序。用戶會從數據庫中看到多選題。對於每個問題,用戶可以選擇單個選項(單選按鈕)或多個選項(複選框)。這存儲在數據庫中作爲布爾字段'多選'。允許使用具有強參數的表單值

我正在使用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 

問題是,當問題是多選,:答案是一個數組,當它是單選擇,:答案是一個整數。我所做的是檢查是否:answer是一個數組,如果不是,則將單個整數轉換爲數組,然後使用上述函數來允許它。

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

將請求中的params和其他任何內容儘可能不變地處理通常是一種很好的做法。

相反,你可以查一下你的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

相關問題