2013-08-30 6 views
9

Ich versuche railscast #196 in Rails 4 zu reproduzieren. Ich habe jedoch einige Probleme.Schienen 4: accepts_nested_attributes_for und Massenzuweisung

In meinem Beispiel ich versuche, ein Telefonbuch zu erzeugen - jede Person mehrere Phonenumbers

Dies sind wichtige Teile meiner Controller haben könnte:

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 

und dies ist meine neue Ansicht

<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 %> 

unnötig zu sagen, ich habe has_many :phones und accepts_nested_attributes_for :phones in meiner Person Modell und belongs_to :person im Telefonmodell.

Ich habe folgende Fragen:

  1. Statt 3 Telefonnummer-Felder gibt nur einen in der neuen Form ist
  2. Wenn ich das Formular bekomme ich einen Fehler:

ActiveModel::ForbiddenAttributesError

in der Linie

@person.phones.build(params[:person][:phones]) 

Parameter:

{"utf8"=>"✓", 
"authenticity_token"=>"l229r46mS3PCi2J1VqZ73ocMP+Ogi/yuYGUCMu7gmMw=", 
"person"=>{"name"=>"the_name", 
"phones"=>{"number"=>"12345"}}, 
"commit"=>"Save Person"} 

Grundsätzlich würde Ich mag diese ganze Sache als eine Form Objekt tun, aber ich denke, wenn ich es mit accepts_nested_attributes bekommen nicht einmal, ich habe keine Chance, es als eine Form zu tun Objekt :(

Antwort

11

um drei Telefone in der Ansicht ändern zu bekommen form_for :person-form_for @person (Sie das Objekt, das Sie gebaut haben hier verwendet werden sollen) wie folgt:

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

als Dies sollte beheben, um den ForbiddenAttributes Fehler Gut.

Und Ihre create Aktion könnte sein:

def create 
    @person = Person.create(person_params) 

    redirect_to people_path 
end 

Update:

<%= form_for :person do |f| %> für das Person Modell eine generische Form erstellt und ist nicht bekannt, die zusätzlichen Informationen, die Sie auf ein bestimmtes Objekt anwenden (in diesem Fall @person in Ihrer new Aktion). Sie haben drei phones an das Objekt @person angefügt, und @person ist nicht dasselbe wie :person weshalb Sie drei Telefonfelder in Ihrer Sicht nicht sehen konnten. Bitte beachten Sie: http://apidock.com/rails/ActionView/Helpers/FormHelper/form_for für weitere Details.

+0

yay! Das hat beide Probleme gelöst - kann nicht sagen, wie froh ich bin! Im Basic Rails Tutorial verwenden sie einen Hash: http://guides.rubyonrails.org/getting_started.html#the-first-form - können Sie den Unterschied ausarbeiten? – speendo

+1

@speendo, Bitte beachten Sie das Update, wenn Sie den Unterschied zwischen der Verwendung des Symbols und der Verwendung des Objekts meinten. – vee

+0

ja, vielen Dank, dass du darauf hingewiesen hast! – speendo