2013-08-30 13 views
9

Sto cercando di riprodurre railscast #196 in Rails 4. Tuttavia, sto riscontrando alcuni problemi.Rails 4: accept_nested_attributes_for e assegnazione di massa

Nel mio esempio ho tenta di generare una Rubrica - ogni persona può avere più PhoneNumbers

Queste sono parti importanti della mia regolatore:

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 

e questa è la mia nuova vista

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

inutile dire che ho has_many :phones e accepts_nested_attributes_for :phones nel modello personale e belongs_to :person nel modello del telefono.

ho i seguenti problemi:

  1. Invece di 3 phone-number-campi c'è solo uno nella nuova forma
  2. Quando presento la forma ottengo un errore:

ActiveModel::ForbiddenAttributesError

nella linea

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

Parametri:

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

In linea di massima mi piacerebbe fare tutta questa cosa come un oggetto forma, ma penso che se non ho neanche capito con accepts_nested_attributes, non ho possibilità di farlo come una forma opporsi :(

risposta

11

al fine di ottenere tre telefoni nel cambiamento vista form_for :person-form_for @person (che si desidera utilizzare l'oggetto che avete costruito qui) come segue:

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

Questo dovrebbe risolvere l'errore ForbiddenAttributes come bene.

e la vostra azione create potrebbe essere:

def create 
    @person = Person.create(person_params) 

    redirect_to people_path 
end 

Aggiornamento:

<%= form_for :person do |f| %> crea una forma generica per il modello Person e non è a conoscenza dei dettagli aggiuntivi si applica a un oggetto specifico (in questo caso @person nell'azione new). Hai aggiunto tre phones all'oggetto @person e @person non è lo stesso di :person ed è per questo che non hai visto tre campi telefonici nella tua vista. Si prega di riferimento: http://apidock.com/rails/ActionView/Helpers/FormHelper/form_for per ulteriori dettagli.

+0

yay! Questo ha risolto entrambi i problemi - non posso dire quanto sono felice! Nel tutorial sui binari di base usano un hash: http://guides.rubyonrails.org/getting_started.html#the-first-form - puoi elaborare la differenza? – speendo

+1

@speendo, vedere l'aggiornamento, se si intende la differenza tra l'uso di simboli e l'uso di oggetti. – vee

+0

sì, grazie per averlo indicato! – speendo

Problemi correlati