由于* _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_attributes
, f.fields_for
助手除外,因为HTML表单现在有一个实际存在于我的模型上的属性。 不幸的是,这导致f.fields_for :name
产生错误说:name
不是有效的proterty。
Pierre-Louis Gottfrois,是对的, 这个问题解决了我的问题。 具体来说我需要添加:
params.require(:person).permit(name_attributes: [:first_name, ...])
关键是name_attributes
后跟一个我想要允许的符号列表。