Nested forms ma chi chiama il controller?

Forse l’oggetto non e’ molto esaustivo ma non mi veniva niente di
meglio.
Il modello Company has_many managers
accepts_nested_attributes_for :managers

ed ho creato un form di questo tipo:

= semantic_form_for(@company, :html => { :multipart => true }) do |f|
= render “manager}_step”, :f => f

= f.buttons do
= f.commit_button :button_html => {:class => “primary”}

il partial manager e’:

= f.semantic_fields_for :managers do |manager|
= manager.inputs :name, :fiscal_code, :city, :zip_code, :address,
:street_number, :tel, :email

Questo form funziona, ovviamente nel controller ci va
@company.managers.build.

Quello che mi sfugge e’:
se nel partial faccio:

= f.semantic_fields_for :manager do |manager|
= manager.inputs :name, :fiscal_code, :city, :zip_code, :address,
:street_number, :tel, :email

cioe’ :manager e non :managers
al submit il form non funziona perche’ per company non esiste
l’attributo manager ma quello che non capisco e’ che comunque viene
presentato il form contenente i campi di manager.
Cio’ significa che viene chiamato il controller di manager con la sua
action new perche’ nel controller company non ho niente che si
riferisce a manager.
Quindi la domanda e’:
com’e’ che mi vengono presentati i campi per il modello Manager?

La action new del controller di manager NON viene chiamata.
Il partial del manager ti viene creato perch glielo hai detto
esplicitamente di crearlo nella pagina con:
= manager.inputs :name, :fiscal_code etc…
Semplicemente non ti va perch viene sbagliato “l’oggetto” su cui creare
i
campi indicati.

La relazione che hai definito con company di tipo 1:N e quindi
plausibile fare @company.managers (che restituir un array di manager) e
il
fields_for va a creare il manager in oggetto inserendolo dentro
@company.managers.

Il giorno 10 gennaio 2012 13:02, Mauro [email protected] ha scritto:


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


Matteo C.
Ufficio Reti e Sistemi
Universit degli Studi di Ferrara
Tel. 0532 97 4153

2012/1/10 Matteo C. [email protected]:

@company.managers.
Quindi se non ho capito male nel controller dovrei creare anche
l’oggetto @company.managers.
Forse sono io che non capisco una mazza ma la questione delle nested
forms con accepts_nested_attributes_for non mi e’ chiara per nulla.
Se io voglio creare una nuova company e contemporaneamente, sfruttando
lo stesso form, creare un Manager e aggiungerlo ai managers della
company non mi basta un @company = Company.new nel controller e un
fields_for :manager nel form?

<%= f.fields_for :managers do |builder| %>

<%= builder.label :name, "Manager name:" %>
<%= builder.text_field :name %>

<% end %>

<%= f.submit "Submit" %>

<% end %>

hai usato fields_for :managers come infatti avevo detto che
funzionava, e non fields_for :manager.
In quest’ultimo caso non funziona anche se faccio il build
dell’oggetto pero’ mi apre comunque il form relativo al manager, e’
questo che non capisco.

Te lo scritto nella prima email: il fatto che ti mostra il forma del
manager dovuto al fatto che nella view hai posizionato i relativi
campi!!! Quello che cambia il nome relativo a quei campi: se apri con
firebug vedrai che in un caso troverai scritto manager e nell’altro
managers!

Dal punto di vista sintattico rails ha ragione e ti visualizza il form
comunque. La differenza sta dal punto di vista semantico!
Il giorno 11/gen/2012 20:11, “Mauro” [email protected] ha scritto:

per il tuo caso userei questo codice

companies_controller.rb

def new
@company = Company.new
@company.managers.build
respond_with @company
end

def create
@company = Company.new(params[:company])
if @company.save
flash[:notice] = ‘Company saved!’
end
respond_with @company
end

company.rb

has_many :managers, :dependent => :destroy

companies/new.html.erb

<%= form_for @company do |f| %>
<%= f.error_messages %>

<%= f.label :name %>
<%= f.text_field :name %>

<%= f.fields_for :managers do |builder| %>

<%= builder.label :name, "Manager name:" %>
<%= builder.text_field :name %>

<% end %>

<%= f.submit "Submit" %>

<% end %>

Il giorno 10 gennaio 2012 17:46, Mauro [email protected] ha scritto:

2012/1/10 Matteo C. [email protected]:

La action new del controller di manager NON viene chiamata.
Il partial del manager ti viene creato perch glielo hai detto
esplicitamente di crearlo nella pagina con:
= manager.inputs :name, :fiscal_code etc…
Semplicemente non ti va perch viene sbagliato “l’oggetto” su cui
creare i
campi indicati.

La relazione che hai definito con company di tipo 1:N e quindi
plausibile fare @company.managers (che restituir un array di manager)
e il
fields_for :manager nel form?


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


Matteo C.
Ufficio Reti e Sistemi
Universit degli Studi di Ferrara
Tel. 0532 97 4153