Ruby e instance_variable set/get
Nella gestione di un sito di e-commerce un passaggio obbligato durante l’acquisto è la scelta del metodo di pagamento che spesso può ricadere su tre o quattro possibili opzioni.
Perchè vi dico questo? Perchè ho avuto una piccola difficoltà nell’automatizzare la generazione della pagina della scelta dei metodi di pagmamento. Nel modello order ho scelto di mettere l’array dei metodi di pagamento in modo da averli sempre accessibili senza dover accedere al database:
1 PAYMENT_TYPES = [ 2 [ "Paypal", 1, "paypal"], 3 [ "Contrassegno", 2, "contrassegno"], 4 [ "Bonifico Bancario", 3, "bonifico"] 5 ].freeze
Nella classe “carrello” ho un attributo (attr_writer) che mi consente di recuperare (e di impostare) in qualunque momento l’id del metodo di pagamento scelto.
ma cosa c’entra in tutto questo l’instance_variable_set e get?
Nella scelta del metodo di pagamento c’è una serie di radio_button che in ogni momento devono essere impostati sul valore corretto scelto dall’utente o automaticamente preso dall’acquisto precedente (almeno nel mio caso) e per semplificare le cose ho deciso di autogenerare l’elenco dei metodi di pagamento.

L’elenco dei metodi di pagamento deriva da un banale ciclo fatto sull’array dei metodi di pagamento tipo questo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
in questo codice c’è instance_variable_get(”@#{p[3]}”) che mi consente di recuperare il valore della variabile “@#{p[3]}” che può essere:
- @paypal
- @contrassegno
- @bonifico
queste tre variabili sono impostate o a {} oppure a {:checked => “checked”} nel caso in cui uno dei metodi di pagamento debba essere selezionato, i valori di queste tre variabili sono automaticamente settati nel controllore con qualcosa di questo genere:
1
Per ogni metodo di pagamento controllo che sia quello scelto dal cliente e imposto la variabile relativa con l’opzione checked necessaria per selezionare il radio button:
1
Quindi se avete una stringa e volete trasformarla in una variabile potete usare:
- instance_variable_set(”@#{nome_variabile}”, value) - per impstarla
- instance_variable_get(”@#{nome_variabile}”) - per leggerla.

