Re: Nomi di metodo dinamici, come fare?


#1

è 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.


#2

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 ?


#3

2008/10/29 Davide S. 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


#4

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.