Archivio di Giugno 2008

Moduli, ereditarietà (inheritance) e controller…

Mercoledì, 18 Giugno 2008

Nei miei innumerevoli test e esperimenti mi sono imbattutto nella necessità di condividere alcuni metodi tra diversi controller. Ho provato utilizzando i moduli.

Ho creato il modulo:

module MetodiCondivisi
   def metodo_condiviso
codice
   end
end

e l’ho incluso nei vari controller

require ‘metodi_condivisi’
class MioController < ApplicationController
import MetodiCondivisi
     def index
        …codice
    end
 end

Per qualsiasi domanda sono qui

Filippo

Ruby on Rails reserved keywords

Giovedì, 5 Giugno 2008

Ho avuto di recente un problema con una applicazione la quale mi restituiva una quantità disumana di errori senza apparentemente avere un motivo valido…

Mi sembra utile riportare questa lista delle parole chiave che è meglio non utilizzare per dare nome alle nostre classi, metodi, helper ecc ecc…

(more…)

Visualizzare dati in base alla data…

Mercoledì, 4 Giugno 2008

Nella fase di test del gestionale che sto sviluppando in Rails mi sono imbattutto in un piccolo problema con le date. In particolare dovevo visualizzare le fatture divise per mese (da inizio mese a fine mese). Con la vecchia soluzione il mese di giugno non veniva visualizzato:

….
        capodanno = “01/01/#{Time.now.year}”.to_time
        @mesi = %w{1 2 3 4 5 6 7 8 9 10 11 12}
        @array_mesi = []
        @mesi.each_index  do |i|
            inizio = capodanno + (i.to_i).month+1.day
            unless inizio > Time.now
                fine = inizio.end_of_month+1.day
                @array_mesi[i] = Fattura.find(:all, :conditions => [ “data > ? and data < ?”, inizio.to_time, fine.to_time], :order => ‘id DESC’)
            end
        end   
….

In questo caso purtroppo la riga

inizio = capodanno + (i.to_i).month+1.day

falliva nel mese di giugno…restituiva 30 maggio invece che 1 giugno e quindi il mese veniva visto come 30 magggio < => 31 maggio. Questo è dovuto alla diversa durata dei mesi (30/31/28 ecc ecc).
Una soluzione più elegante (e che soprattutto funziona) è la seguente:

….
        @mesi = %w{1 2 3 4 5 6 7 8 9 10 11 12}
        @array_mesi = []
        @mesi.each_index  do |i|
            inizio = “#{1 + i.to_i}/01/#{Time.now.year}”.to_time
            unless inizio > Time.now
                fine = inizio.end_of_month+1.day
                @array_mesi[i] = Fattura.find(:all, :conditions => [ “data > ? and data < ?”, inizio.to_time, fine.to_time], :order => ‘id DESC’)
            end           
        end
….

Con il codice:

inizio = “#{1 + i.to_i}/01/#{Time.now.year}”.to_time

sfrutto la variabile iteratore i (gestita automaticamente dal metodo each_index) per formare la stringa della data e la trasformo successivamente in un oggetto di tipo time (con il metodo speciale to_time).
Sicuramente ci sarà una versione ancora più elegante e breve ma questa è quella che mi è venuta in mente al volo…se avete suggerimenti fatemi sapere!