# Rails: form complessi?

**URL:** <https://www.ruby-forum.com/t/rails-form-complessi/149038>\
**Category:** IT\
**Created:** [September 19, 2008, 4:33pm UTC](https://www.ruby-forum.com/t/rails-form-complessi/149038 "2008-09-19T16:33:53Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![giorgian](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/2acd7d/32.png) [@giorgian](https://www.ruby-forum.com/u/giorgian)\
**Post date:** [September 19, 2008, 4:33pm UTC](https://www.ruby-forum.com/t/rails-form-complessi/149038/1 "2008-09-19T16:33:53Z")

</div>

salve a tutt,

sto provando a modificare l’esempio visibile su:

> **[\#73 Complex Forms Part 1 - RailsCasts](http://railscasts.com/episodes/73-complex-forms-part-1)**
>
> Short Ruby on Rails screencasts containing tips, tricks and tutorials. Great for both novice and experienced web developers.

sintesi: un unico form di creazione di un modello A (nell’esempio:  
project) che ha molti modelli B (nell’esempio: tasks), gestito con la  
minore quantità di codice possibile.

nel mio caso, semplicemente, il modello B ha non un attributo, ma due.

nel controller, il metodo new:  
def new  
@attachment = Attachment.new  
2.times { @attachment.amounts.build }  
end

questo è quello che scrivo nel template:

- form\_for :attachment, @attachment, :url =\> {:action =\> :create},  
:html =\> {:multipart =\> true} do |f|  
.field  
= f.label :title.l, {}, {:class =\> “required”}  
%br  
= f.text\_field :title  
…
- for amount in @attachment.amounts
  - fields\_for “attachment[amounts\_attributes][]”, amount do |af|  
.field  
= af.label :tax\_base, :tax\_base.l  
%br  
= af.text\_field :tax\_base  
.field  
= af.label :vat\_rate, :vat\_rate.l  
%br  
= af.text\_field :vat\_rate, :size =\> 2  
…

(traduco per chi non usa haml (ma davvero? ma che aspettate?)):

\<%- form\_for :attachment, @attachment, :url =\> {:action =\> :create,  
:controller =\> :attachment}, :html =\> {:multipart =\> true} do |f| -%\>

 \<%= f.label :title.l, {}, {:class =\> "required"} -%\>   
 \<%= f.text\_field :title -%\> 
 ... \<%- for amount in @attachment.amounts -%\> \<%- fields\_for "attachment[amounts\_attributes][]", amount do |af| -%\> 
 \<%= af.label :tax\_base, :tax\_base.l -%\>   
 \<%= af.text\_field :tax\_base -%\> 

 \<%= af.label :vat\_rate, :vat\_rate.l -%\>   
 \<%= af.text\_field :vat\_rate, :size =\> 2 -%\> 
 \<%- end -%\> \<%- end -%\> ... \<%- end -%\>

il problema è che il controller riceve, in params:

{“attachment”=\>{  
“title”=\>“”,  
“amounts\_attributes”=\>[  
{“tax\_base”=\>“”},  
{“vat\_rate”=\>“”, “tax\_base”=\>“”},  
{“vat\_rate”=\>“”}]}  
}  
invece, vorrei che ricevesse:

```
"amounts_attributes"=>[{"tax_base"=>"", "vat_rate"=>""},
                       {"vat_rate"=>"", "tax_base"=>""}]}

```

N.B.: ho provato con IE7, Firefox 3, Safari for Windows, Chrome.

cosa mi sfugge, esattamente?

grazie

pietro

---

<div class="post-metadata">

**Author:** ![giorgian](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/2acd7d/32.png) [@giorgian](https://www.ruby-forum.com/u/giorgian)\
**Post date:** [September 19, 2008, 6:27pm UTC](https://www.ruby-forum.com/t/rails-form-complessi/149038/2 "2008-09-19T18:27:21Z")

</div>

> {"attachment"=\>{

Toglierei dalle cause il browser, in quanto non centra molto, ma mi  
sembra  
un comportamento molto strano. Andrei a vedermi l’HTML generato per  
capire  
in che modo viene strutturato l’HTML.  
Ad ogni modo creda che la soluzione migliore sia quella di usare mass  
assigment[http://ryandaigle.com/articles/2008/7/19/what-s-new-in-edge-rails-nested-models](http://ryandaigle.com/articles/2008/7/19/what-s-new-in-edge-rails-nested-models),  
che permettono l’inserimento di ‘modelli relazionati’ in modo più  
automatico.

Ecco come cambierebbe il tuo codice in linea di massima (non testato)

Questa è la vista.

\<% form\_for :attachment … do |att| %\>  
\<%= att.text\_field :title %\>  
\<% att.fields\_for :amounts do |amt| %\>  
\<%= amt.text\_field :tax\_base %\>  
\<%= amt.text\_field :vat\_rate %\>  
\<% end %\>  
\<% end %\>

che dovrebbe ritornare

{  
:title =\> ‘title’,  
:amounts =\> [  
{ :tax\_base =\> ‘tax\_1’, vat\_rate =\> ‘vat\_1’ },  
{ :tax\_base =\> ‘tax\_2’, vat\_rate =\> ‘vat\_2’ }  
]  
}

Nel model aggiungi la proprietà accessible a true, così riesci a definire  
l’inserimento degli amounts in automatico. In altre parole se trova  
nell’ash  
di ritorno una entry :amounts, per ogni elemento presente nell’arrai  
genera  
un record associato ad attachment.

class Attachment \< ActiveRecord::Base  
has\_many :amounts, :accessible =\> true  
end

Nell’azione del controller ti basta definire questa singola linea e  
tutto  
viene creato (attachment ed amounts)

Attachment.create(params[:attachment])

Fammi sapere come va 😉

---

<div class="post-metadata">

**Author:** ![giorgian](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/2acd7d/32.png) [@giorgian](https://www.ruby-forum.com/u/giorgian)\
**Post date:** [September 22, 2008, 12:13pm UTC](https://www.ruby-forum.com/t/rails-form-complessi/149038/3 "2008-09-22T12:13:45Z")

</div>

On Fri, Sep 19, 2008 at 6:26 PM, Andrea R.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> […]  
> Nel model aggiungi la proprietà accessible a true, così riesci a definire  
> l’inserimento degli amounts in automatico. In altre parole se trova nell’ash  
> di ritorno una entry :amounts, per ogni elemento presente nell’arrai genera  
> un record associato ad attachment.
> 
> class Attachment \< ActiveRecord::Base  
> has\_many :amounts, :accessible =\> true  
> end

da quel che ho capito, questa feature era presente solo in edge, però  
è stata tolta pochi giorni fa, e quindi non  
c’è più…  
tu usi edge?

---

<div class="post-metadata">

**Author:** ![giorgian](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/2acd7d/32.png) [@giorgian](https://www.ruby-forum.com/u/giorgian)\
**Post date:** [September 22, 2008, 5:09pm UTC](https://www.ruby-forum.com/t/rails-form-complessi/149038/4 "2008-09-22T17:09:25Z")

</div>

On Mon, Sep 22, 2008 at 12:13 PM, Pietro G.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)wrote:

> > class Attachment \< ActiveRecord::Base  
> > has\_many :amounts, :accessible =\> true  
> > end
> 
> da quel che ho capito, questa feature era presente solo in edge, però  
> è stata tolta pochi giorni fa, e quindi non c’è più…
> 
> tu usi edge?

Che pacco… no, non lo uso, ma mi ricordavo di questa feature dopo  
averla  
letta, e credevo fosse bella che inserita ormai.

–  
Andrea R., [http://mikamai.com](http://mikamai.com)  
Writing [http://sensejs.wordpress.com/](http://sensejs.wordpress.com/)  
Collaborating [http://therubymine.it](http://therubymine.it)  
Reading [http://stacktrace.it](http://stacktrace.it)
