允许使用强参数

时间:2016-10-03 15:47:29

标签: ruby-on-rails forms validation

我正在编写一个带有rails 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

问题是当问题是多选时,:answer是一个数组,当它是单选时,:answer是一个整数。我所做的是检查: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

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

将请求中的参数和其他任何内容尽可能不可变地处理为一般情况通常是一种好习惯。

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