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

2023-12-04

我试图在我的主 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不是有效的属性。


皮埃尔·路易斯·戈特弗瓦 (Pierre-Louis Gottfrois) 是对的,这个问题解决了我的问题。具体来说我需要添加:

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

关键是name_attributes接下来是我想要允许的符号列表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

由于形式中的 *_attributes 后缀,强参数、嵌套属性和 Mongoid 似乎不起作用? 的相关文章

随机推荐