# Re: Nomi di metodo dinamici, come fare?

**URL:** <https://www.ruby-forum.com/t/re-nomi-di-metodo-dinamici-come-fare/152014>\
**Category:** IT\
**Created:** [October 28, 2008, 11:48pm UTC](https://www.ruby-forum.com/t/re-nomi-di-metodo-dinamici-come-fare/152014 "2008-10-28T23:48:42Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![gabriele\_renzi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e19b73/32.png) [@gabriele\_renzi](https://www.ruby-forum.com/u/gabriele_renzi)\
**Post date:** [October 28, 2008, 11:48pm UTC](https://www.ruby-forum.com/t/re-nomi-di-metodo-dinamici-come-fare/152014/1 "2008-10-28T23:48:42Z")

</div>

è la seconda parte della risposta di luca:

0.upto(9) do |i|  
question.send “attribute”+i.to\_s

end

Se non ci sono accessor e gli attributi sono privati puoi fare

0.upto(9) do |i|  
question.instance\_variable\_get “@attribute”+i.to\_s  
end

ma IMVVHO è un design bruttino, forse potresti usare una struttura dati  
diversa, ad esempio una sottoclasse di Struct ha metodi per accedere ai  
propri attributi come un Enumerable (each, map etc). Come diceva Luca,  
se Question è un oggetto di ActiveRecord analogamente ci sono metodi  
più appropriati.

---

<div class="post-metadata">

**Author:** ![gabriele\_renzi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e19b73/32.png) [@gabriele\_renzi](https://www.ruby-forum.com/u/gabriele_renzi)\
**Post date:** [October 29, 2008, 2:36am UTC](https://www.ruby-forum.com/t/re-nomi-di-metodo-dinamici-come-fare/152014/2 "2008-10-29T02:36:25Z")

</div>

Ho provato come mi avete detto…

\<% 1.upto(8) do |i| %\>

```
  <% if question.send("r"+i.to_s)? %>
    <tr>
      <td><%=h question.send("r"+i.to_s) %></td>
      <td><%=h question.send("p"+i.to_s) %></td>
    </tr>
  <% end %>

```

\<% end %\>

…perÃ² quel punto di domanda mi manda in crisi tutto… come mai?  
Nella logica dell’applicazione mi serve, perchÃ¨ controlla che il campo  
del modello non sia vuoto.

In effetti Question Ã¨ un Active Record mappato a tabella come da  
scaffold, quindi quale sarebbe la soluzione migliore ?

* * *

> ma IMVVHO ï¿½ un design bruttino, forse potresti usare una struttura dati  
> diversa, ad esempio una sottoclasse di Struct ha metodi per accedere ai  
> propri attributi come un Enumerable (each, map etc). Come diceva Luca,  
> se Question ï¿½ un oggetto di ActiveRecord analogamente ci sono metodi  
> piï¿½ appropriati.

* * *

Questa parte non l’ho capita benissimo, come ho detto sono alle prime  
armi e alle prime esperienze di programmazione.  
Come funziona questa classe Struct ?

---

<div class="post-metadata">

**Author:** ![gabriele\_renzi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e19b73/32.png) [@gabriele\_renzi](https://www.ruby-forum.com/u/gabriele_renzi)\
**Post date:** [October 29, 2008, 9:27am UTC](https://www.ruby-forum.com/t/re-nomi-di-metodo-dinamici-come-fare/152014/3 "2008-10-29T09:27:12Z")

</div>

2008/10/29 Davide S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> \<% end %\>
> 
> …però quel punto di domanda mi manda in crisi tutto… come mai?  
> Nella logica dell’applicazione mi serve, perchè controlla che il campo  
> del modello non sia vuoto.

ciao,  
perché il punto di domanda è fuori dal send?  
prova con  
if question.send(“r#{i.to\_s}?”)

riguardo ad ActiveRecord, ecco come vengono definiti i metodi con ?:  
def #{attr\_name}?; query\_attribute(‘#{attr\_name}’); end

questo significa che puoi trasformare il tuo if in  
if question.query\_attribute(“q#{i.to\_s}”)

cosa che a me piace più che usare send; comunque, la scelta è tua.

pietro

---

<div class="post-metadata">

**Author:** ![gabriele\_renzi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e19b73/32.png) [@gabriele\_renzi](https://www.ruby-forum.com/u/gabriele_renzi)\
**Post date:** [October 29, 2008, 2:36pm UTC](https://www.ruby-forum.com/t/re-nomi-di-metodo-dinamici-come-fare/152014/4 "2008-10-29T14:36:29Z")

</div>

> questo significa che puoi trasformare il tuo if in  
> if question.query\_attribute(“q#{i.to\_s}”)
> 
> cosa che a me piace più che usare send; comunque, la scelta è tua.

…poi come diceva luca nel primo messaggio mettici anche read\_attribute  
al posto di send (noto ora che read\_attribute è protected, quindi usa  
question[attr+i.to\_s] )

Ma tu hai già un hash degli attributi, per cui puoi fare:

question.attributes.each do |name,value|  
if value  
puts “name is:” + value.to\_s  
end  
end

Così se un domani scegli di dare nomi diversi (r1 r2 -\> foo, bar) sei già a  
posto.
