# Parziali, scope e :locals

**URL:** <https://www.ruby-forum.com/t/parziali-scope-e-locals/79239>\
**Category:** IT\
**Created:** [December 13, 2006, 3:28pm UTC](https://www.ruby-forum.com/t/parziali-scope-e-locals/79239 "2006-12-13T15:28:32Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![david](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/aeb1de/32.png) [@david](https://www.ruby-forum.com/u/david)\
**Post date:** [December 13, 2006, 3:28pm UTC](https://www.ruby-forum.com/t/parziali-scope-e-locals/79239/1 "2006-12-13T15:28:32Z")

</div>

Ciao,  
in rails 1.2 il modo consigliato per creare i form Ã¨ usare “form\_for”  
e poi indicare con l’url e il metodo HTTP quello che deve succedere.  
(Se non ho capito male.)  
In altre parole il che corrisponde a “create” Ã¨ diverso dal  
form che fa un “update”. Il primo Ã¨ un POST e il secondo un PUT.  
Quindi, se voglio usare un partial condiviso per create/update,  
questo  
deve escludere il “form\_for”.  
Se chiamo form\_for con un block - com’Ã¨ kosher fare - il codice erb  
nel partial non vive nello stesso scope del block (e perchÃ© no???),  
ma  
devo usare il parametro :locals nella chiamata a “render”.  
Quindi, questo funziona:

\<% form\_for :channel, @channel, :url =\> channel\_path(@channel), :html =\>  
{:meth  
od =\> :put} do |f| %\>  
\<%= render :partial =\> “form”, :locals =\> {:f =\> f}%\>  
\<% end %\>

E questo invece no:

\<% form\_for :channel, @channel, :url =\> channel\_path(@channel), :html =\>  
{:meth  
od =\> :put} do |f| %\>  
\<%= render :partial =\> “form” %\>  
\<% end %\>

Sono solo io, o questo Ã¨ un comportamento anti-DRY e anti-ruby??? il  
“render(:partial)” vive nel block di “form\_for()” e dovrebbe usare lo  
stesso scope. Mi sembra proprio brutto dover usare :locals…  
☹

---

<div class="post-metadata">

**Author:** ![david](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/aeb1de/32.png) [@david](https://www.ruby-forum.com/u/david)\
**Post date:** [December 13, 2006, 3:40pm UTC](https://www.ruby-forum.com/t/parziali-scope-e-locals/79239/2 "2006-12-13T15:40:35Z")

</div>

Il giorno 13/dic/06, alle ore 15:26, david ha scritto:

Anche io sono incorso in questo problema, ma l’ho trovato un’aggiunta  
utile perché in questo modo posso passare altre variabili al blocco e  
rendere i partials un pò più indipendenti dal contesto.

---

<div class="post-metadata">

**Author:** ![david](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/aeb1de/32.png) [@david](https://www.ruby-forum.com/u/david)\
**Post date:** [December 13, 2006, 4:06pm UTC](https://www.ruby-forum.com/t/parziali-scope-e-locals/79239/3 "2006-12-13T16:06:38Z")

</div>

Non bellissimo, ma per evitarmi il :local, io uso @f anziche’ f.

\<% form\_for :customer, @customer, :url =\> { :action =\> “create” } do  
|@f| %\>  
\<%= render :partial =\> ‘form’ %\>  
\<%= submit\_tag ‘Create’ %\>  
\<% end %\>

david wrote:

> Ciao,  
> in rails 1.2 il modo consigliato per creare i form Ã¨ usare “form\_for”  
> e poi indicare con l’url e il metodo HTTP quello che deve succedere.  
> (Se non ho capito male.)  
> In altre parole il che corrisponde a “create” Ã¨ diverso dal  
> form che fa un “update”. Il primo Ã¨ un POST e il secondo un PUT.  
> Quindi, se voglio usare un partial condiviso per create/update,  
> questo  
> deve escludere il “form\_for”.  
> Se chiamo form\_for con un block - com’Ã¨ kosher fare - il codice erb  
> nel partial non vive nello stesso scope del block (e perchÃ© no???),  
> ma  
> devo usare il parametro :locals nella chiamata a “render”.  
> Quindi, questo funziona:
> 
> \<% form\_for :channel, @channel, :url =\> channel\_path(@channel), :html =\>  
> {:meth  
> od =\> :put} do |f| %\>  
> \<%= render :partial =\> “form”, :locals =\> {:f =\> f}%\>  
> \<% end %\>
> 
> E questo invece no:
> 
> \<% form\_for :channel, @channel, :url =\> channel\_path(@channel), :html =\>  
> {:meth  
> od =\> :put} do |f| %\>  
> \<%= render :partial =\> “form” %\>  
> \<% end %\>
> 
> Sono solo io, o questo Ã¨ un comportamento anti-DRY e anti-ruby??? il  
> “render(:partial)” vive nel block di “form\_for()” e dovrebbe usare lo  
> stesso scope. Mi sembra proprio brutto dover usare :locals…  
> ☹

---

<div class="post-metadata">

**Author:** ![david](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/aeb1de/32.png) [@david](https://www.ruby-forum.com/u/david)\
**Post date:** [December 13, 2006, 4:34pm UTC](https://www.ruby-forum.com/t/parziali-scope-e-locals/79239/4 "2006-12-13T16:34:41Z")

</div>

Ok, mica dico che :locals va rimosso, ma una chiamata effetuata dentro  
un block, dovrebbe ben vivere nello scope del block, no? Continua a  
parere parecchio brutto…  
:-/  
Giovanni I. wrote:

```
 Il giorno 13/dic/06, alle ore 15:26, david ha scritto:
 Anche io sono incorso in questo problema, ma l'ho trovato
 un'aggiunta utile perché in questo modo posso passare altre
 variabili al blocco e rendere i partials un pò più indipendenti dal
 contesto.

    Sono solo io, o questo è un comportamento anti-DRY e
 anti-ruby??? il
    "render(:partial)" vive nel block di "form_for()" e dovrebbe
 usare lo
    stesso scope. Mi sembra proprio brutto dover usare :locals...

 _______________________________________________
 Ml mailing list
 [1]removed_email_address@domain.invalid
 [2]http://lists.ruby-it.org/mailman/listinfo/ml

```

–  
“Remember, always be yourself. Unless you suck.” - Joss Whedon

References

1. [mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
2. [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

---

<div class="post-metadata">

**Author:** ![david](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/aeb1de/32.png) [@david](https://www.ruby-forum.com/u/david)\
**Post date:** [December 13, 2006, 5:38pm UTC](https://www.ruby-forum.com/t/parziali-scope-e-locals/79239/5 "2006-12-13T17:38:51Z")

</div>

Wow! Pure quello è orrendissimo!  
🙂  
Ma come fa a funzionare? E’ una variabile di classe che nasce/muore  
solo nel block??? Aiuto… E’ una classvariable del controller,  
giusto?  
Che confusione…  
Massimo wrote:

Non bellissimo, ma per evitarmi il :local, io uso @f anziche’ f.

\<% form\_for :customer, @customer, :url =\> { :action =\> “create” } do  
|@f| %\>  
\<%= render :partial =\> ‘form’ %\>  
\<%= submit\_tag ‘Create’ %\>  
\<% end %\>

david wrote:

Ciao,  
in rails 1.2 il modo consigliato per creare i form è usare “form\_for”  
e poi indicare con l’url e il metodo HTTP quello che deve succedere.  
(Se non ho capito male.)  
In altre parole il che corrisponde a “create” è diverso dal  
form che fa un “update”. Il primo è un POST e il secondo un PUT.  
Quindi, se voglio usare un partial condiviso per create/update,  
questo  
deve escludere il “form\_for”.  
Se chiamo form\_for con un block - com’è kosher fare - il codice erb  
nel partial non vive nello stesso scope del block (e perché no???),  
ma  
devo usare il parametro :locals nella chiamata a “render”.  
Quindi, questo funziona:

\<% form\_for :channel, @channel, :url =\> channel\_path(@channel), :html =\>  
{:meth  
od =\> :put} do |f| %\>  
\<%= render :partial =\> “form”, :locals =\> {:f =\> f}%\>  
\<% end %\>

E questo invece no:

\<% form\_for :channel, @channel, :url =\> channel\_path(@channel), :html =\>  
{:meth  
od =\> :put} do |f| %\>  
\<%= render :partial =\> “form” %\>  
\<% end %\>

Sono solo io, o questo è un comportamento anti-DRY e anti-ruby??? il  
“render(:partial)” vive nel block di “form\_for()” e dovrebbe usare lo  
stesso scope. Mi sembra proprio brutto dover usare :locals…  
☹

```
_______________________________________________________________________

```

* * *

Ml mailing list  
[1]removed\_email\_address@domain.invalid  
[2][http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

–  
“Remember, always be yourself. Unless you suck.” - Joss Whedon

References

1. [mailto:removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
2. [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

---

<div class="post-metadata">

**Author:** ![david](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/aeb1de/32.png) [@david](https://www.ruby-forum.com/u/david)\
**Post date:** [December 13, 2006, 10:01pm UTC](https://www.ruby-forum.com/t/parziali-scope-e-locals/79239/6 "2006-12-13T22:01:39Z")

</div>

On 12/13/06, david [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Ma come fa a funzionare? E’ una variabile di classe che nasce/muore  
> solo nel block???

Sembra di si`.

> Aiuto… E’ una classvariable del controller,

Instance variable.

> giusto?

Per aggiungere qualcosa al rumore, se ho capito bene, le instance  
variables sono visibili nelle views, ma le class variables ( @@foo,  
per esempio) non lo sono. Se mi ricordo bene, e` quasi meglio pensare al @ come una specie di identificatore, invece di pensare a regole di classi e visibilita` di variabili.

–  
David N. Welton

- [http://www.dedasys.com/davidw/](http://www.dedasys.com/davidw/)

Linux, Open Source Consulting

- [http://www.dedasys.com/](http://www.dedasys.com/)
