Rails 4: accepts_nested_attributes_for и массовое назначение
Я пытаюсь воспроизвести railscast #196 в Rails 4. Однако у меня возникли некоторые проблемы.
В моем примере я пытаюсь создать телефонную книгу - каждый человек может иметь несколько телефонных номеров
Это важные части моего контроллера:
class PeopleController < ApplicationController
def new
@person = Person.new
3.times{ @person.phones.build }
end
def create
@person = Person.create(person_params)
@person.phones.build(params[:person][:phones])
redirect_to people_path
end
private
def person_params
params.require(:person).permit(:id, :name, phones_attributes: [ :id, :number ])
end
end
и это мой новый взгляд
<h1>New Person</h1>
<%= form_for :person, url: people_path do |f| %>
<p>
<%= f.label :name %> </ br>
<%= f.text_field :name %>
</p>
<%= f.fields_for :phones do |f_num| %>
<p>
<%= f_num.label :number %> </ br>
<%= f_num.text_field :number %>
</p>
<% end %>
<p>
<%= f.submit %>
</p>
<% end %>
Излишне говорить, что у меня есть has_many :phones
а также accepts_nested_attributes_for :phones
в модели моего лица и belongs_to :person
в модели телефона.
У меня есть следующие проблемы:
- Вместо 3-х полей номера телефона в новой форме есть только одно
- Когда я отправляю форму, я получаю сообщение об ошибке:
ActiveModel:: ForbiddenAttributesError
в соответствии
@person.phones.build(params[:person][:phones])
Параметры:
{"utf8"=>"✓",
"authenticity_token"=>"l229r46mS3PCi2J1VqZ73ocMP+Ogi/yuYGUCMu7gmMw=",
"person"=>{"name"=>"the_name",
"phones"=>{"number"=>"12345"}},
"commit"=>"Save Person"}
В принципе, я хотел бы сделать все это как объект формы, но я думаю, что если я даже не получу это с accepts_nested_attributes, у меня нет шансов сделать это как объект формы:(
1 ответ
Для того, чтобы получить три телефона в представлении изменить form_for :person
в form_for @person
(вы хотите использовать объект, который вы построили здесь) следующим образом:
<%= form_for @person, url: people_path do |f| %>
Это должно исправить ForbiddenAttributes
ошибка тоже.
И ваш create
действие может быть:
def create
@person = Person.create(person_params)
redirect_to people_path
end
Обновить:
<%= form_for :person do |f| %>
создает общую форму для Person
модель и не знает о дополнительных деталях, которые вы применяете к конкретному объекту (в этом случае @person
в вашем new
действие). Вы прикрепили три phones
к @person
объект и @person
это не то же самое, что :person
вот почему вы не видите три поля телефона в вашем представлении. Пожалуйста, обратитесь: http://apidock.com/rails/ActionView/Helpers/FormHelper/form_for для получения дополнительной информации.