# View personalizzate

**URL:** <https://www.ruby-forum.com/t/view-personalizzate/133540>\
**Category:** IT\
**Created:** [April 1, 2008, 1:08pm UTC](https://www.ruby-forum.com/t/view-personalizzate/133540 "2008-04-01T13:08:27Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 1, 2008, 1:08pm UTC](https://www.ruby-forum.com/t/view-personalizzate/133540/1 "2008-04-01T13:08:27Z")

</div>

Salve a tutti,  
e’ da qualche tempo che gioco con ror, ma senza essermi mai spinto oltre  
i fondamenti base.  
Mi trovo davanti a un problema che non so come approcciare, vi spiego:  
io ho un modello A che ha intorno diversi altri modelli legati a lui, B,  
C, D i quali possiedono tutti la chiave di A (a\_id).  
Nella new di A io vorrei visualizzare (oltre alla new di A stesso) le  
new di B, C e D e in fase di “save” poter fare lo store dei campi  
inseriti per A ma anche dei dati per B, C, e D comprensivi della chiave  
primaria (id) di A appena create (e’ settata come autoincrement).

Spero di essere stato abbastanza chiaro, nel caso saro’ lieto di  
esplicare il mio problema magari con uno schema.

Attendo aiuti e consigli.

Saluti

---

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 1, 2008, 1:40pm UTC](https://www.ruby-forum.com/t/view-personalizzate/133540/2 "2008-04-01T13:40:06Z")

</div>

Forse non ti capito bene… ma diciamo che hai una situazione del  
genere: un blog (con estrema fantasia!).

class Post \< ActiveRecord::Base  
has\_many :comments  
end

class Comment \< ActiveRecord::Base  
belongs\_to :post  
end

Allora (provalo in una console) puoi fare:

p = Post.new  
p.title = ‘A title’  
p.body = ‘Some bla bla…’  
p.comments \<\< Comment.new(:content =\> ‘nice post!’)  
p.save

Il nuovo commento viene “automaticamente” associato a p. Quando salvi  
p salvi anche tutti gli oggetti “dipendenti”… (ripeto: provalo in  
una console).

Il 01/04/08, Matteo Buferli[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha scritto:

---

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 1, 2008, 1:57pm UTC](https://www.ruby-forum.com/t/view-personalizzate/133540/3 "2008-04-01T13:57:32Z")

</div>

On Apr 1, 2008, at 1:08 PM, Matteo Buferli wrote:

> inseriti per A ma anche dei dati per B, C, e D comprensivi della  
> chiave  
> primaria (id) di A appena create (e’ settata come autoincrement).
> 
> Spero di essere stato abbastanza chiaro, nel caso saro’ lieto di  
> esplicare il mio problema magari con uno schema.

Facciamo un esempio semplice (ai limiti dello stupido…): un form per  
creare un contatto (Contact) e un  
indirizzo collegato (Address)  
Contact ha 2 campi (first\_name e last\_name) e una relazione  
(has\_many :addresses) verso Address.  
Address ha 2 campi (street\_address e city) e una relazione  
(belongs\_to :contact) verso Contact

Il controller:  
class ContactsController  
def new  
@contact = Contact.new  
@address = Address.new  
end

def create  
@contact = Contact.new(params[:contact])  
if @contact.save  
@address = @contact.addresses.build(params[:address])  
if @address.save  
redirect\_to contact\_url(@contact) and return  
end  
end  
render :action =\> “new”  
end  
end

il template:

\<% form\_for @contact do |f| %\>  
\<%= error\_messages\_for(“contact”) %\>

First name: \<%= f.text\_field(:first\_name)

Last name: \<%= f.text\_field(:last\_name)

 \<% fields\_for @address do |af| %\> \<%= error\_messages\_for("address") %\> 

Address: \<%= af.text\_field(:street\_address) %\>

City: \<%= af.text\_field(:city) %\>

 \<%= submit\_tag "Create" %\> \<% end %\>

Spero sia abbastanza chiaro (e di non aver fatto errori 🙂

S.

PS  
per correttezza il codice di #create dovrebbe gestire il caso in cui  
@contact e’ valido ma @address no (per esempio con una transazione)

---

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 1, 2008, 4:36pm UTC](https://www.ruby-forum.com/t/view-personalizzate/133540/4 "2008-04-01T16:36:50Z")

</div>

Stefano C. wrote:

> Il controller:  
> class ContactsController  
> def new  
> @contact = Contact.new  
> @address = Address.new  
> end
> 
> def create  
> @contact = Contact.new(params[:contact])  
> if @contact.save  
> @address = @contact.addresses.build(params[:address])  
> if @address.save  
> redirect\_to contact\_url(@contact) and return  
> end  
> end  
> render :action =\> “new”  
> end  
> end

Grazie mille, ora provo… per complettezza volevo chiederti il  
significato di questo blocco che non mi e’ molto chiaro

```
  @contact = Contact.new(params[:contact])
  if @contact.save
    @address = @contact.addresses.build(params[:address])
    if @address.save
      redirect_to contact_url(@contact) and return
    end
  end
```

---

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 1, 2008, 4:47pm UTC](https://www.ruby-forum.com/t/view-personalizzate/133540/5 "2008-04-01T16:47:26Z")

</div>

On Apr 1, 2008, at 4:36 PM, Matteo Buferli wrote:

> ```
> end
> 
> ```

1. inizializza @contact con i parametri contenuti nella chiave :contact

2. prova a salvare @contact

3. inizializza un Address usando la relazione @contact.addresses (per  
impostare la foreign key automaticamente)

4. prova a salvare @address

5. redirigi e ritorna dal metodo

6. se @contact.save o @address.save falliscono, renderizza di nuovo il  
form… solo che mi sono dimenticato la riga:

Chiaramente se @contact e’ valido ma @address no, bisognerebbe fare il  
rollback (con una transazione o cancellando manualmente @contact)

S.

---

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 1, 2008, 7:14pm UTC](https://www.ruby-forum.com/t/view-personalizzate/133540/6 "2008-04-01T19:14:54Z")

</div>

Scusate, ho risposto qui…

[http://www.ruby-forum.com/topic/148190#new](http://www.ruby-forum.com/topic/148190#new)
