(Rails)不寻常的嵌套属性quirk:params hash需要整数键

时间:2016-02-11 12:49:26

标签: ruby-on-rails hash nested-forms nested-attributes strong-parameters

编写嵌套表单时遇到了问题。

我收到了以下错误:

TypeError (no implicit conversion of Symbol into Integer):
app/controllers/people_controller.rb:9:in `create'

参数白名单:

        def person_params
          params.require(:person).permit(
            :id, :name, :role, :dob, 
            :work_place, :assessment_id, 
            :telephone, :occupation, 
            person_notes_attributes: [
                            :id, :is_referee, :is_requester,
                            :is_key_holder, :is_house_member, :is_present,
                            :is_visitor, :presence_explanation, :visitor_info
                            ] )
        end

典型的表单元素:

 <%= check_box_tag "person[person_notes_attributes][is_referee]", "true", false  %>
 <%= label_tag "person[person_notes_attributes][is_referee]", 'Requested referral?' %>

经过一番搜索,我认为我已经回归blog post中描述的问题的本质。

作者指出此错误是由rails如何解释params散列的索引引起的。

他注意到:

  

Rails期望params [:user] [:keys_attributes]使用整数作为键(就像数组一样),但它找到了符号。

在我的情况下,这将是

params[:person][:person_notes_attributes].

作者与我的案例之间的区别在于他们正在POST json个数据并提供默认参数。

他们的解决方案是通过将hash包裹在array element中来修复他们提供的声明默认参数。

我已尝试过他们的解决方案,虽然它可以让我成功保存PersonNote的记录,但form inputs不会覆盖提供的默认值。

我该如何解决这个问题?

理想情况下,我想要一个不需要声明默认值的解决方案。

0 个答案:

没有答案