# Oggetti "composti"

**URL:** <https://www.ruby-forum.com/t/oggetti-composti/226257>\
**Category:** IT\
**Created:** [December 28, 2011, 7:33pm UTC](https://www.ruby-forum.com/t/oggetti-composti/226257 "2011-12-28T19:33:15Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![silviodel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c2a13f/32.png) [@silviodel](https://www.ruby-forum.com/u/silviodel)\
**Post date:** [December 28, 2011, 7:33pm UTC](https://www.ruby-forum.com/t/oggetti-composti/226257/1 "2011-12-28T19:33:15Z")

</div>

piano piano sto leggendo il libro agile web development with rails ma mi  
pare di allontanarmi sempre più da quello che dovrei fare ☹

tra partial e simboli mi sto perdendo e non riesco neanche a fare (beh a  
meno che non è realmente difficile) una vista con oggetti “composti”…

esempio?

un utente che ha tra i suoi parametri nome, cognome e per esempio  
indirizzo (che è una classe a parte)

ho fatto le associazioni e creato le viste… per lo show non ho  
moltissimi problemi, che invece vengono con l’edit, il destroy e la  
new…

credo che il problema sia nei controller… diciamo che mi basterebbe  
sapere come manipolare nei form i campi di tipo Address gestiti nelle  
pagine di inserimento, modifica e distruzione di User che ha un campo  
Address…

ecco il mio ultimo codice… ovviamente spara errori a raffica…

il modello User has\_one :address e Address belongs\_to :user

Vista per il new:

# Inserisci un nuovo utente

\<% form\_for(@user) do |f| %\>  
\<%= f.error\_messages %\>

\<%= f.label :nick %\>  
 \<%= f.text\_field :nick %\>

\<%= f.label :nome %\>  
 \<%= f.text\_field :nome %\>

\<%= f.label :cognome %\>  
 \<%= f.text\_field :cognome %\>

\<%= f.label :email %\>  
 \<%= f.text\_field :email %\>

\<% f.fields\_for @address do |address\_fields| %\>  
via : \<%= address\_fields.text\_field :indirizzo %\>  
citta: \<%= address\_fields.text\_field :citta %\>  
\<%# end %\>  
\<% end %\>

\<%= f.submit 'Crea' %\>

\<% end %\>

\<%= link\_to ‘Indietro’, users\_path %\>

Vista per l’edit (ci sono un sacco di cose commentate… sono le  
prove…)

# Modifica utente

\<% form\_for(@user) do |f| %\>  
\<%= f.error\_messages %\>

\<%= f.label :nome %\>  
 \<%= f.text\_field :nome %\>

\<%= f.label :cognome %\>  
 \<%= f.text\_field :cognome %\>

\<%= f.label :email %\>  
 \<%= f.text\_field :email %\>

\<%= f.label :nick %\>  
 \<%= a= :nick

```
#nome=@user.nome
#text=@user.nome
%>
lll
<%= f.text_field :nick %>

```

\<%# form\_for @person, :url =\> { :action =\> “update” } do |person\_form|  
%\>  
\<%# person\_form.fields\_for :address do |address\_fields| %\>  
\<% f.fields\_for :address do |address\_fields| %\>  
Street : \<%= address\_fields.text\_field :indirizzo %\>  
Zip code: \<%= address\_fields.text\_field :citta %\>  
\<%# end %\>  
\<% end %\>

\<%#

_%\>  
\<%#= f.label :indirizzo %\>_  
  
_\<%#= f.text\_field :address %\>  
\<%#_

%\>

\<%#

_%\>  
\<%#= f.label :citta %\>_  
  
_\<%#= f.text\_field :citta %\>  
\<%#_

%\>

```
<p>
<b>Indirizzo:</b>
<%= @user.address.indirizzo if @user.address!=nil%>
<b>-</b>
<%= @user.address.citta if @user.address!=nil%>
<%#= t.label :@user.address.citta %>

```

 \<%#= @addr.citta %\>

```
<%# for @address in @user.address %>

```

\<%#= error\_messages\_for :address %\>  
\<%# fields\_for “address[]” do |f| %\>  
\<%#\*

\<%= f.text\_field :name %\>

%\>  
\<%# end %\>  
\<%# end %\>

```
<fieldset>

```

Territorio di competenza \<%# fields\_for :address do |t| %\>

\<%#

_%\>  
\<%#= t.label :carica %\>  
\<%#= t.text\_field :carica%\>  
\<%#_

%\>

```
<%#= @address=@address[0] %>
<%#= @address %>

```

\<%#

_%\>  
\<%#= t.label :indirizzo %\>  
\<%#= t.text\_field :indirizzo%\>  
\<%#_

%\>

\<%#

_%\>  
\<%#= t.label :citta %\>  
\<%#= t.text\_field :citta%\>  
\<%#_

%\>

\<%# end %\>

\<%= f.submit 'Aggiorna' %\>

\<% end %\>

\<%= link\_to ‘Mostra’, @user %\> |  
\<%= link\_to ‘Indietro’, users\_path %\>

Controller:

class UsersController \< ApplicationController  
def index  
@users = User.all

```
respond_to do |format|
  format.html # index.html.erb
  format.xml { render :xml => @users }
end

```

end

def show  
@user = User.find(params[:id])  
@address = Address.find(:all, :conditions =\> [‘user\_id = ?’,  
@user.id])

```
respond_to do |format|
  format.html # show.html.erb
  format.xml { render :xml => @user }
end

```

end

def new  
@user = User.new  
@address = Address.new

```
respond_to do |format|
  format.html # new.html.erb
  format.xml { render :xml => @user }
end

```

end

# GET /users/1/edit

def edit  
@user = User.find(params[:id])

# @address = @user.address

@address = Address.find\_by\_sql("select \* from users, addresses " + "  
where user\_id = users.id ")

end

def create  
@user = User.new(params[:user])  
@address = Address.new(params[:address])

# @address = @user.address[0].build(params[:address])

```
User.transaction do

```

@address.save!  
@user.address = @address  
@user.save!  
redirect\_to :action =\> :show, :id =\> @user  
end  
rescue ActiveRecord::RecordInvalid =\> e  
@address.valid? # force checking of errors even if products failed  
render :action =\> :new  
#end

```
respond_to do |format|
  if @user.save
    format.html { redirect_to(@user, :notice => 'Utente creato con

```

successo’) }  
format.xml { render :xml =\> @user, :status =\> :created,  
:location =\> @user }  
else  
format.html { render :action =\> “new” }  
format.xml { render :xml =\> @user.errors, :status =\>  
:unprocessable\_entity }  
end  
end  
end

def update  
@user = User.find(params[:id])

```
@address = @user.address

respond_to do |format|
  if @user.update_attributes(params[:user])
    format.html { redirect_to(@user, :notice => 'Modifica effettuata

```

con successo.’) }  
format.xml { head :ok }  
else  
format.html { render :action =\> “edit” }  
format.xml { render :xml =\> @user.errors, :status =\>  
:unprocessable\_entity }  
end  
end  
end

def destroy  
@user = User.find(params[:id])  
@user.destroy

```
respond_to do |format|
  format.html { redirect_to(users_url) }
  format.xml { head :ok }
end

```

end

end

grazie a tutti voi che mi sopportate ☹

---

<div class="post-metadata">

**Author:** ![silviodel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c2a13f/32.png) [@silviodel](https://www.ruby-forum.com/u/silviodel)\
**Post date:** [December 29, 2011, 10:12am UTC](https://www.ruby-forum.com/t/oggetti-composti/226257/2 "2011-12-29T10:12:37Z")

</div>

aiutino… please ☹

---

<div class="post-metadata">

**Author:** ![silviodel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c2a13f/32.png) [@silviodel](https://www.ruby-forum.com/u/silviodel)\
**Post date:** [December 29, 2011, 10:16am UTC](https://www.ruby-forum.com/t/oggetti-composti/226257/3 "2011-12-29T10:16:18Z")

</div>

io non saprei proprio cosa dirti xD sono ancora ai primi capitoli del  
libro, sono messo peggio di te T\_T

Il giorno 29 dicembre 2011 10:12, Silvio Dell’Oste  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)ha scritto:

---

<div class="post-metadata">

**Author:** ![silviodel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c2a13f/32.png) [@silviodel](https://www.ruby-forum.com/u/silviodel)\
**Post date:** [December 29, 2011, 10:23am UTC](https://www.ruby-forum.com/t/oggetti-composti/226257/4 "2011-12-29T10:23:44Z")

</div>

2011/12/28 Silvio Dell’Oste [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[snip]

ecco il mio ultimo codice… ovviamente spara errori a raffica…

> 

[snip]  
Suggerimenti che non c’entrano col tuo codice ma che aiutano nel  
troubleshooting in generale:  
a) usiamo gist/pastebin per incollare codice… aiuta nella lettura  
della  
email  
b) posta anche l’errore che ti da cos possiamo darti una mano.

[1][https://gist.github.com/](https://gist.github.com/)  
[2][http://pastebin.com/](http://pastebin.com/)

HTH

–  
“… static analysis is fun, again!”

life from an application security guy ~\> [http://thesp0nge.com](http://thesp0nge.com)

---

<div class="post-metadata">

**Author:** ![silviodel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c2a13f/32.png) [@silviodel](https://www.ruby-forum.com/u/silviodel)\
**Post date:** [December 29, 2011, 10:44am UTC](https://www.ruby-forum.com/t/oggetti-composti/226257/5 "2011-12-29T10:44:46Z")

</div>

Credo che ti convenga dare un occhiata alla serie di RailsCasts sui  
nested model TI giro i link degli asciicast.

> **[\#196 Nested Model Form Part 1 - RailsCasts](http://railscasts.com/episodes/196-nested-model-form-part-1?language=it&view=asciicast)**
>
> Short Ruby on Rails screencasts containing tips, tricks and tutorials. Great for both novice and experienced web developers.

> **[\#197 Nested Model Form Part 2 - RailsCasts](http://railscasts.com/episodes/197-nested-model-form-part-2?language=it&view=asciicast)**
>
> Short Ruby on Rails screencasts containing tips, tricks and tutorials. Great for both novice and experienced web developers.

MC

Il 29 dicembre 2011 10:22, Paolo P. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha  
scritto:

> b) posta anche l’errore che ti da cos possiamo darti una mano.
> 
> * * *
> 
> Ml mailing list  
> removed\_email\_address@domain.invalid  
> [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

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

---

<div class="post-metadata">

**Author:** ![silviodel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c2a13f/32.png) [@silviodel](https://www.ruby-forum.com/u/silviodel)\
**Post date:** [December 29, 2011, 12:06pm UTC](https://www.ruby-forum.com/t/oggetti-composti/226257/6 "2011-12-29T12:06:34Z")

</div>

ecco qua l’errore…

git://gist.github.com/1533515.git

ActiveRecord::AssociationTypeMismatch in UsersController#create

Address(#3524) expected, got HashWithIndifferentAccess(#3526)

RAILS\_ROOT:  
C:/Users/Silvio/Documents/NetBeansProjects/RailsApplicationSilvio  
Application Trace | Framework Trace | Full Trace

C:/Program Files/NetBeans  
6.9.1/ruby/jruby-1.5.1/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active\_record/associations/association\_proxy.rb:259:in  
`raise_on_type_mismatch' C:/Program Files/NetBeans 6.9.1/ruby/jruby-1.5.1/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/has_one_association.rb:55:in `replace’  
C:/Program Files/NetBeans  
6.9.1/ruby/jruby-1.5.1/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active\_record/associations.rb:1287:in  
`address=' C:/Program Files/NetBeans 6.9.1/ruby/jruby-1.5.1/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2906:in `assign\_attributes’  
C:/Program Files/NetBeans  
6.9.1/ruby/jruby-1.5.1/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active\_record/base.rb:2902:in  
`each' C:/Program Files/NetBeans 6.9.1/ruby/jruby-1.5.1/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2902:in `assign\_attributes’  
C:/Program Files/NetBeans  
6.9.1/ruby/jruby-1.5.1/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active\_record/base.rb:2775:in  
`attributes=' C:/Program Files/NetBeans 6.9.1/ruby/jruby-1.5.1/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2473:in `initialize’  
C:/Users/Silvio/Documents/NetBeansProjects/RailsApplicationSilvio/app/controllers/users\_controller.rb:61:in  
`new' C:/Users/Silvio/Documents/NetBeansProjects/RailsApplicationSilvio/app/controllers/users_controller.rb:61:in `create’

Request

Parameters:

{“authenticity\_token”=\>“iXQRCyle/pQSb/FEPcg1H8DU8HE/9EdGOnCZ9v/xAyk=”,  
“user”=\>{“nick”=\>“”,  
“nome”=\>“”,  
“cognome”=\>“”,  
“email”=\>“”,  
“address”=\>{“indirizzo”=\>“”,  
“citta”=\>“”}},  
“commit”=\>“Crea”}

Matteo C. wrote in post #1038664:

> Credo che ti convenga dare un occhiata alla serie di RailsCasts sui  
> nested model TI giro i link degli asciicast.

> **[\#196 Nested Model Form Part 1 - RailsCasts](http://railscasts.com/episodes/196-nested-model-form-part-1?language=it&view=asciicast)**
>
> Short Ruby on Rails screencasts containing tips, tricks and tutorials. Great for both novice and experienced web developers.

> 

> **[\#197 Nested Model Form Part 2 - RailsCasts](http://railscasts.com/episodes/197-nested-model-form-part-2?language=it&view=asciicast)**
>
> Short Ruby on Rails screencasts containing tips, tricks and tutorials. Great for both novice and experienced web developers.

> MC

purtroppo ho già visto quelle lezioni… così come quelle vecchie  
(73-74-75) ma mi hanno solo confuso le idee introducendo cose nuove…  
tipo i partial che ancora non comprendo a pieno (anche se ho capito a  
cosa servono)

io per ora vorrei solo sapere come si fa a modificare, inserire e  
distruggere oggetti “multipli” in una sola vista… ovvero avere nella  
stessa pagina la possibilità di manipolare i dati dell’utente e il  
relativo indirizzo nel mio esempio…

diciamo che mi basterebbe capire forse come funzionano i simboli… dato  
che nel form\_for su @users se scrivo

\<%= f.label :nome %\>  
  
\<%= f.text\_field :nome %\>

tutto funziona alla grande… ma ovviamente non posso scrivere  
:indirizzo, potrei scrivere :address ma non avrebbe senso… ma non  
posso scrivere qualcosa del tipo :address.indirizzo o qualcosa del  
genere…

quindi faccio

fields\_for @address do |address\_fields| %\>  
Street : \<%= address\_fields.text\_field :indirizzo %\>  
Zip code: \<%= address\_fields.text\_field :citta %\>  
\<% end %\>

ma poi l’azione è sempre su @user… quindi dovrei forse passare anche  
@address e modificare il controller…

grazie a tutti

---

<div class="post-metadata">

**Author:** ![silviodel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/c2a13f/32.png) [@silviodel](https://www.ruby-forum.com/u/silviodel)\
**Post date:** [December 29, 2011, 8:57pm UTC](https://www.ruby-forum.com/t/oggetti-composti/226257/7 "2011-12-29T20:57:58Z")

</div>

risolto… anche se… con la magina ☹

nel senso che ho usato accepts\_nested\_attributes\_for che esiste da non  
so quanto… precedentemente immagino che si doveva scrivere qualcosa…

comunque posto il codice così se qualcuno dovesse avere lo stesso  
problema risolve…

> <https://gist.github.com/anonymous/1535921>

user.rb

class User \< ActiveRecord::Base  
has\_one :address, :dependent =\> :destroy

validates\_presence\_of :nome, :nick, :cognome, :message =\> “è un campo  
obbligatorio”  
validates\_uniqueness\_of :nick, :message =\> “è un camppo univoco,  
ripeti inserendo un nuovo nick”

accepts\_nested\_attributes\_for :address, :allow\_destroy =\> true

end

new.html.erb

# Inserisci un nuovo utente

\<% form\_for(@user) do |f| %\>  
\<%= f.error\_messages %\>

\<%= f.label :nick %\>  
 \<%= f.text\_field :nick %\>

\<%= f.label :nome %\>  
 \<%= f.text\_field :nome %\>

\<%= f.label :cognome %\>  
 \<%= f.text\_field :cognome %\>

\<%= f.label :email %\>  
 \<%= f.text\_field :email %\>

Indirizzo \<% f.fields\_for :address do |address\_fields| %\>

Via : \<%= address\_fields.text\_field :indirizzo %\>

Città: \<%= address\_fields.text\_field :citta %\>

\<% end %\>

\<%= f.submit 'Crea' %\>

\<% end %\>

\<%= link\_to ‘Indietro’, users\_path %\>

address.rb  
class Address \< ActiveRecord::Base  
belongs\_to :user

end

user\_controller.rb

class UsersController \< ApplicationController

# GET /users

# GET /users.xml

def index

```
@users = User.all

respond_to do |format|
  format.html # index.html.erb
  format.xml { render :xml => @users }
end

```

end

# GET /users/1

# GET /users/1.xml

def show  
@user = User.find(params[:id])

```
@address=@user.address

respond_to do |format|
  format.html # show.html.erb
  format.xml { render :xml => @user }
end

```

end

# GET /users/new

# GET /users/new.xml

def new  
@user = User.new

```
  @address=@user.build_address
respond_to do |format|
  format.html # new.html.erb
  format.xml { render :xml => @user }
end

```

end

# GET /users/1/edit

def edit  
@user = User.find(params[:id])  
@address=@user.address

end

# POST /users

# POST /users.xml

def create  
@user = User.new(params[:user])

```
  if @user.save
        redirect_to :action => 'show', :id => @user
        flash[:notice] = "Your record has been saved."
  else
        render :action => 'new'
  end

```

end

# PUT /users/1

# PUT /users/1.xml

def update  
@user = User.find(params[:id])

```
respond_to do |format|
  if @user.update_attributes(params[:user])
    format.html { redirect_to(@user, :notice => 'Modifica effettuata 

```

con successo.') }  
format.xml { head :ok }  
else  
format.html { render :action =\> “edit” }  
format.xml { render :xml =\> @user.errors, :status =\>  
:unprocessable\_entity }  
end  
end  
end

# DELETE /users/1

# DELETE /users/1.xml

def destroy  
@user = User.find(params[:id])  
@user.destroy

```
respond_to do |format|
  format.html { redirect_to(users_url) }
  format.xml { head :ok }
end

```

end  
end
