我正在尝试在我的主要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 -->
最后我允许控制器中的name属性,以便Strong Params允许嵌套属性通过:
def person_params
params.require(:person).permit(:name)
end
它不起作用,我收到错误Unpermitted parameters: name_attributes
。发生的事情是当我调用f.fields_for :name ...
时,“_attributes”将get附加到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!
可以工作,但我不喜欢它,因为据我所知,这是一个完整的反模式。
我还尝试将:name
更改为:name_attributes
,但f.fields_for
帮助器除外,因为HTML表单现在具有实际存在于我的模型上的属性。不幸的是,这导致f.fields_for :name
出现错误,指出:name
不是有效的保护。
答案 0 :(得分:3)
Pierre-Louis Gottfrois,是的,this question解决了我的问题。具体来说,我需要添加:
params.require(:person).permit(name_attributes: [:first_name, ...])
关键是name_attributes
,后面是我想要允许的符号列表。