2013-08-30 13 views
9

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:

  1. Zamiast 3 phone-number-Fields jest tylko jeden w nowej formie
  2. 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 :(

Odpowiedz

11

aby uzyskać trzy telefony w zmianie widoku form_for :person do form_for @person (chcesz używać obiekt, który został zbudowany tutaj) w następujący sposób:

<%= form_for @person, url: people_path do |f| %> 

ten powinien naprawić błąd ForbiddenAttributes jako dobrze.

A twoja akcja create mogą być:

def create 
    @person = Person.create(person_params) 

    redirect_to people_path 
end 

Aktualizacja:

<%= form_for :person do |f| %> tworzy formę ogólną dla modelu Person i nie zdaje sobie sprawę z dodatkowymi szczegółami można zastosować do konkretnego obiektu (w tym przypadku @person w akcji new). Dołączono trzy obiekty: phones do obiektu @person, a @person to nie to samo co :person, dlatego w widoku nie było trzech pól telefonicznych. Proszę zapoznać się z: http://apidock.com/rails/ActionView/Helpers/FormHelper/form_for w celu uzyskania dalszych szczegółów.

+0

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

+1

@speendo, Proszę zobaczyć aktualizację, jeśli chodziło o różnicę między używaniem symbolu a używaniem obiektu. – vee

+0

tak, dzięki za wskazanie tego! – speendo