我正在尝试在我的主要 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
不是一个有效的属性。