Forum: Italian Ruby user group Re: Nomi di metodo dinamici, come fare ?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
C01072ccffb1f2d23f8b5f686e5b106a?d=identicon&s=25 gabriele renzi (Guest)
on 2008-10-28 23:48
(Received via mailing list)
è 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.
F514a744c5dc71c2a67e0f10023efaa8?d=identicon&s=25 Davide Spaggiari (spaggio)
on 2008-10-29 02:36
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 ?
8768bcdbda1adf80e4da6744268868af?d=identicon&s=25 Pietro Giorgianni (giorgian)
on 2008-10-29 09:27
(Received via mailing list)
2008/10/29 Davide Spaggiari <davidespaggiari@gmail.com>:
>
> <% 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
C01072ccffb1f2d23f8b5f686e5b106a?d=identicon&s=25 gabriele renzi (Guest)
on 2008-10-29 14:36
(Received via mailing list)
> 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.
This topic is locked and can not be replied to.