Я пытаюсь внедрить группы свойств в свою основную модель Person, чтобы помочь организовать мой код, но Strong Params в 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!
действительно работает, но мне это не нравится, поскольку, насколько я могу судить, это полный антишаблон.
Я также пытался изменить :name
везде на :name_attributes
, кроме помощника f.fields_for
, так как форма HTML теперь имела свойство, которое действительно существовало в моей модели. К сожалению, это привело к тому, что f.fields_for :name
выдало ошибку, говорящую, что :name
не является допустимым свойством.