3

我正在尝试在我的主要 Person 模型中嵌入属性组,以帮助保持我的代码井井有条,但 Rails 4 的 Strong Params 阻碍了我。

情景

我有一个Person模型和一个PersonName像这样的模型:

class Person
  include Mongoid::Document
  embeds_one :name, class_name: 'PersonName'
  accepts_nested_attributes_for :name
end

class PersonName
  include Mongoid::Document
  embedded_in :person, inverse_of: :name
  # fields here
end

然后fields_for,我使用表单中的助手将PersonName属性嵌套在Person _form

<%= f.fields_for :name, PersonName.new do |builder| %>
  <!-- etc -->

最后我允许控制器中的名称属性,以便强参数允许嵌套属性通过:

def person_params
  params.require(:person).permit(:name)
end

问题

它不起作用,我得到错误Unpermitted parameters: name_attributes。发生的事情是当我调用f.fields_for :name ...“_attributes”获取附加到 HTML 表单中的字段时。例如,如果我有一个字段first_name,那么表单如下所示:

<input name="person[name_attributes][first_name] ...>

代替:

<input name="person[name][first_name] ...>

据我所知,这是预期的行为,因此该方法似乎.permit无法正常工作。

尝试过的变通方法

我尝试将 Strong Params 行更改为:

params.require(:person).permit(:name_attributes)

但这不起作用。Usingpermit! 确实有效,但我不喜欢它,因为据我所知它是一个完整的反模式。

我还尝试:name在任何地方更改为:name_attributes,除了在f.fields_for帮助程序中,因为 HTML 表单现在有一个实际存在于我的模型上的属性。不幸的是,这导致f.fields_for :name产生一个错误,说它:name不是一个有效的属性。

4

1 回答 1

3

Pierre-Louis Gottfrois,是对的,这个问题解决了我的问题。具体来说,我需要添加:

params.require(:person).permit(name_attributes: [:first_name, ...])

紧随其后的name_attributes是我想要允许的符号列表。

于 2013-08-30T09:28:38.003 回答