我试图在我的主 Person 模型中嵌入属性组,以帮助保持我的代码组织有序,但 Rails 4 的强参数阻碍了我的工作。
场景
我有一个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 -->
最后,我允许控制器中的名称属性,以便 Strong Params 允许通过以下方式嵌套属性:
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)
但这行不通。使用permit!
does工作,但我不喜欢它,因为据我所知,这是一个完全的反模式。
我也尝试过改变:name
到处去:name_attributes
,除了在f.fields_for
助手,因为 HTML 表单现在拥有一个实际存在于我的模型上的属性。不幸的是这导致了f.fields_for :name
产生错误说:name
不是有效的属性。