由于* _attributes后缀的forms,强参数,嵌套属性和Mongoid似乎不起作用?

我正在尝试在我的主要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

   

最后我允许控制器中的name属性,以便Strong Params允许嵌套属性通过:

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

问题

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

  

代替:

  

据我所知,这是预期的行为,所以似乎.permit方法是事情无法工作的地方。

尝试过的工作

我已经尝试将Strong Params行更改为:

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

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

我也尝试过更改:name无处不在:name_attributesf.fields_for助手除外,因为HTML表单现在有一个实际存在于我的模型上的属性。 不幸的是,这导致f.fields_for :name产生错误说:name不是有效的proterty。

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

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

关键是name_attributes后跟一个我想要允许的符号列表。