Archivi per la categoria ‘Ruby on Rails’

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!

Convertire una stringa in un nome di classe

Sabato, 31 Maggio 2008

Vi sarà sicuramente capitato in una fase di programmazione avanzata di voler convertire una semplice stringa in un nome di classe. Facciamo un esempio pratico:
Tramite una normalissima form vogliamo passare il nome di un modello come parametro ad un metodo che si occupi poi di richiamare il metodo find appropriato? niente di più semplice in pieno stile ruby ;-)

#per comodità assegno alla variabile stringa il paramentro in arrivo
stringa = params[:model]
#converto la stringa in modello e richiamo la find
stringa.camelize.constantize.find(:all)

Camelize si occupa di rendere la stringa in formato corretto: “il mio modello” diventa “IlMioModello”
Constantize invece cerca una costante con il nome corrispondente alla stringa già “cammelizzata” (cioè maiuscole/minuscole).

Di seguito i link al mio server con la documentazione relativa:

Documentazione di camelize
Documentazione di constantize

E’ tutto!

Installare RMagick su Leopard

Sabato, 31 Maggio 2008

E’ da un pò che ci giravo intorno, non volevo utilizzare Macports ma alla fine mi sono convinto. Cominciamo.

Scenario:

  • iMac 24″ nuovo di pallino
  • Installazione fresca fresca di Leopard 10.5.3

Come ormai è ben noto Macosx 10.5.3 (Leopard) è l’unico sistema operativo che esce di default con Ruby e Rails installati e perfettamente funzionanti.

Con i comandi

ruby -v
rails -v

è possibile conoscere le rispettive versioni che mamma Apple ha installato per noi.

Il mio consiglio (ed anche Apple stessa lo dice) è quello di aggiornare subito sia il sistema Gem che le relative gemme installate (quindi anche Rails).

sudo gem update –system
sudo gem update

Una volta terminato l’aggiornamento passiamo all’argomento che da il titolo a questo articolo, cioè come installare RMagick su Leopard per poter poi utilizzare le funzioni di manipolazione immagini nelle nostre web application…

(more…)

Quando i fantastici quattro ‘girano in casa’

Venerdì, 30 Maggio 2008

Ovvero come compilare ed installare Ruby, Rails Imagemagick Rmagick nella propria /home/ senza chiedere aiuto a ’sudo’: questa procedura ha dato ottimi risultati su DreamHost, ma dovrebbe funzionare egregiamente su ogni host.

Il problema nasce dal fatto che nessuna azienda di hosting renderá mai disponibile la versione piú recente dei pacchetti installati sul server per non incorrere in troppi bugs e cosí capita che proprio quando fai un deploy dell’applicazione Rails che in localhost funziona tranquillamente, in produzione ha un comportamento differente e solitamente sono errori fatali!

1) PREPARARE L’AMBIENTE

editare il file ~/.bash_profile come segue

umask 002
PS1=’[\h:$PWD]$ ‘
alias restart=”touch tmp/restart.txt” *
EDITOR=”/usr/bin/nano”
. .bashrc

*opzionale: é utile su DreamHost per riavviare le applicazioni Rails che girano in produzione con Passenger

editare il file ~/.bashrc

export TZ=ECT # visto che ci siamo impostiamo European Central Time
export LD_LIBRARY_PATH=$HOME/.packages/lib
export PATH=$HOME/.packages/bin:$HOME/.gems/bin:${PATH}
export GEM_HOME=$HOME/.gems
export GEM_PATH=$GEM_HOME:/usr/lib/ruby/gems/1.8
export LDFLAGS=-L/$HOME/.packages/lib
export LD_RUN_PATH=$HOME/.packages/lib
export CPPFLAGS=-I/$HOME/.packages/include

chiediamo alla shell di ricaricare i file di configurazione e verifichiamo che tutto sia stato caricato correttamente:

$. ~/.bash_profile
$ env

env vi mostrerá un elenco di variabili d’ambiente tra le quali anche quelle appena aggiunte: se non é cosí scommetto 5€ che non avete scritto i file di configurazione nella vostra home: rimediare con cd ~ e ricominciare!

2) CREARE LE DIRECTORY OPERATIVE

$ mkdir .gems && mkdir .src && mkdir .packages

3) SCI! Scaricare, Compilare, Installare

== READLINE ==

$ cd ~/.src
$ wget ftp://ftp.cwru.edu/pub/bash/readline-5.2.tar.gz
$ tar zxvf readline-5.2.tar.gz
$ cd readline-5.2
$ ./configure –prefix=$HOME/.packages
$ make
$ make install
$ rm readline-5.2.tar.gz && rm -Rf readline-5.2
$ cd ~

== RUBY ==

$ cd ~/.src
$ wget ftp://ftp.ruby-lang.org:21/pub/ruby/ruby-1.8.6-p114.tar.gz
$ tar zxvf ruby-1.8.6-p114.tar.gz
$ cd ruby-1.8.6-p114
$./configure –prefix=$HOME/.packages –with-readline-dir=$HOME/.packages
$ make
$ make install
$ rm ruby-1.8.6-p114.tar.gz && rm -Rf ruby-1.8.6-p114
$ cd ~

controlliamo?

$ which ruby
/home/yourhome/.packages/bin/ruby
$ ruby -v
ruby 1.8.6 (2008-03-03 patchlevel 114) [i686-linux]

== RubyGems ==

$ cd ~/.src
$ wget http://rubyforge.org/frs/download.php/20989/rubygems-0.9.4.tgz
$ tar zxvf rubygems-0.9.4.tgz
$ cd rubygems-0.9.4
$ ruby setup.rb config –prefix=$HOME/.packages
$ ruby setup.rb setup
$ ruby setup.rb install –prefix=$HOME/.packages/
$ rm rubygems-0.9.4.tgz && rm -Rf rubygems-0.9.4
$ cd ~

controlliamo?

$ which gem
/home/yourhome/.packages/bin/gem
$gem list -l

*** LOCAL GEMS ***

actionmailer (1.3.6, 1.2.5)
actionpack (1.13.6, 1.12.5)
actionwebservice (1.2.6, 1.1.6)
activerecord (1.15.6, 1.14.4)
activesupport (1.4.4, 1.3.1)
login_generator (1.2.2)
rails (1.2.6, 1.1.6)
rake (0.8.1, 0.7.1)
rmagick (2.3.0, 1.14.1)
rubygems-update (1.1.1)
sources (0.0.1)

ora é possibile..

$gem update –system

oppure

$ gem install rails –include-dependencies

== ImageMagick ==

$ cd ~/.src
$ wget ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick.tar.gz
$ tar xvfz ImageMagick.tar.gz
$ cd ImageMagick-6.4.1/
$./configure –prefix=$HOME/.packages -without-perl –with-gslib –with-gs-font-dir=/usr/share/fonts/type1/gsfonts/ && make && make install
(–with-gslib –with-gs-font-dir=/usr/share/fonts/type1/gsfonts/ é richiesto solo da DreamHost!)
$ rm ImageMagick.tar.gz && rm -Rf ImageMagick-6.4.1
$ cd ~

come sempre possiamo controllare che il comando convert di IM sia presente e sia proprio quello appena installato..

$ which convert
/home/yourhome/.packages/bin/convert

l’ultima versione di IM é davvero potente! provate questo, su un’immagine ‘image.jpg’ ;)

$ convert -font Times -background ‘#0008′ -fill white -gravity center -size 200×40 -pointsize 25 label:”Sono Stupido!” +size image.jpg +swap -gravity south -composite label_image.jpg

== RMagick ==

$ cd ~/.src
$ wget ‘http://rubyforge.org/frs/download.php/23510/rmagick-1.15.8.gem’
$ gem install -l rmagick-1.15.8.gem — –build-opts –prefix=$HOME/.packages/
$ rm rmagick-1.15.8.gem

A questo punto dimenticare di inserire questa direttiva nel file config/environment.rb delle vostre applicazioni Rails sarebbe davvero un grave errore..

ENV['GEM_PATH'] = ‘/home/yourname/.gems’

Buon Divertimento!