Próbuję odtworzyć railscast #196 w Rails 4. Jednak mam pewne problemy.Szyny 4: accepts_nested_attributes_for i przypisanie masy
W moim przykładzie próbuję wygenerować książkę telefoniczną - każda osoba mogła wiele PhoneNumbers
Są to ważne elementy mojego kontrolera:
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
i to jest mój nowy widok
<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 %>
Nie trzeba dodawać, że mam has_many :phones
i accepts_nested_attributes_for :phones
w modelu my person i belongs_to :person
w modelu telefonu.
Mam następujące kwestie:
- Zamiast 3 phone-number-Fields jest tylko jeden w nowej formie
- Kiedy przesłać formularz pojawia się błąd:
ActiveModel::ForbiddenAttributesError
w linii
@person.phones.build(params[:person][:phones])
Parametry:
{"utf8"=>"✓",
"authenticity_token"=>"l229r46mS3PCi2J1VqZ73ocMP+Ogi/yuYGUCMu7gmMw=",
"person"=>{"name"=>"the_name",
"phones"=>{"number"=>"12345"}},
"commit"=>"Save Person"}
W zasadzie chciałbym zrobić całą rzecz jako obiekt formularza, ale myślę, że jeśli nawet nie dostać go z accepts_nested_attributes, nie mam szansę zrobić to jako formę object :(
yay! To rozwiązało oba problemy - nie mogę powiedzieć, jak bardzo się cieszę! W podstawowym tutorialu do szyn używają skrótu: http://guides.rubyonrails.org/getting_started.html#the-first-form - czy możesz wyjaśnić różnicę? – speendo
@speendo, Proszę zobaczyć aktualizację, jeśli chodziło o różnicę między używaniem symbolu a używaniem obiektu. – vee
tak, dzięki za wskazanie tego! – speendo