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

时间:2013-08-30 07:51:44

标签: ruby-on-rails mongoid ruby-on-rails-4 strong-parameters

我正在尝试在我的主要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不是有效的保护。

1 个答案:

答案 0 :(得分:3)

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

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

关键是name_attributes,后面是我想要允许的符号列表。