Attenzione ad usare unscoped per inibire il default_scope

Scritto da Silvio Relli oltre 2 anni fa. Jan3

Su un'applicazione Rails 3, mettiamo ci sia un default_scope sul modello Article che restituisce soltanto gli articoli pubblicati.

Con la seguente interrogazione
@article = current_user.articles.unscoped.find(params[:id])
vorremmo ottenere un determinato articolo anche se non è pubblicato, usando il metodo unscoped per annullare l'effetto del default scope.

Purtroppo però unscoped annulla anche il controllo sulla relazione dell'articolo con l'utente, togliendo praticamente il where che filtra l'utente dalla select, e permettendo di ottenere il post di un utente qualsiasi.

Similmente con @articles = current_user.articles.unscoped.all non otteniamo solamente gli articoli del current_user ma bensì tutti gli articoli.

Non solo si tratta di un comportamento inaspettato e non documentato, ma anche non auspicabile.

Fate molta attenzione perchè l'uso di unscoped può portare a comportamenti decisamente indesiderabili!
 

Postato in  | Tag , , ,

Versioni multiple di Ruby in produzione con RVM e Passenger Standalone

Scritto da Silvio Relli oltre 2 anni fa. Dec16

Rails RVM NginxVisto il rilascio odierno di Phusion Passenger 3.0.2 mi sono finalmente deciso a scrivere un articolo su come utilizzare versioni diverse di Ruby contemporaneamente su un server di produzione.

Con Ruby on Rails 3 ed il suo pieno supporto a Ruby 1.9.2 ci troviamo di fronte al problema di sfruttare questa accoppiata vincente (e molto performante) su server in produzione su cui è configurato il buon vecchio Ruby 1.8.7
Tra l'altro ci sono già esempi di applicazioni come ror_ecommerce che hanno abbandonato totalmente il supporto a Rails 2.x e Ruby 1.8.x

Grazie a Ruby Version Manager già  da tempo è possibile installare su una macchina di sviluppo varie versioni indipendenti di Ruby, ognuna col proprio insieme di gemme, ed effettuare lo switch da una versione all'altra secondo le necessità  in modo veloce ed indolore.

Cosa differente è invece il tenere contemporaneamente in esecuzione applicazioni che si appoggiano a set di librerie di versioni diverse!

Fino a qualche tempo fa  era necessario ricorrere a configurazioni molto particolari (o alla virtualizzazione), mentre con il rilascio di Phusion Passenger 3 nella sua incarnazione standalone la faccenda si è abbastanza semplificata.
Anche se questa guida sembra lunga vi assicuro che gli step da compiere sono veramente pochi!

Vediamo allora come far girare in produzione una web app Rails 3 con Ruby 1.9.2 in un server su cui sono già presenti Ruby 1.8.7 Enterprise Edition, Apache 2 e Passenger 3.
La configurazione seguente è stata fatta su una Debian Testing, ma non credo ci siano problemi ad applicarla a Ubuntu server o una qualsiasi macchina Linux.

La soluzione è utilizzare Passenger Standalone (basato su Nginx) come webserver e connetterlo ad Apache tramite reverse proxy.

Personalmente ho l'abitudine di effettuare l'installazione di una web app nella home di un utente (es: /home/railsuserX/sites/web-app-X) in modo da effettuare il deploy con Capistrano tramite un utente non privilegiato.
Ciò va perfettamente d'accordo con RVM, la cui installazione di default è tramite utente comune (non root e non system-wide).

Il primo passo è dunque installare RVM come utente non privilegiato, potete seguire la ottima guida ufficiale sempre aggiornata.

Completata l'installazione di rvm, installiamo e switchamo su Ruby 1.9.2
rvm install 1.9.2
rvm use 1.9.2


Installiamo le prime gemme essenziali
gem install rails bundler passenger

Andiamo nella directory dove è installata la nuova webapp che deve girare con Ruby 1.9.2 ed installiamo le relative gemme.
Anche se molte gemme sono già  installate system-wide per la versione nativa di Ruby sul sistema, esse devono essere installate anche per il corrente gemset di RVM.
cd /home/railsusrX/sites/web-app-X/
bundle install


Avviamo l'app con Passenger Standalone come demone in background su una porta diversa da quella di default, ad esempio la 3001, poichè sulla 80 già risiede Apache di sistema.
In maniera quasi sorprendente Passenger scaricherà , compilerà ed installerà tutto il necessario per poi avviarsi.
passenger start -a 127.0.0.1 -p 3001 -d -e production

Se tutto è andato bene la nostra applicazione sta girando in background su Nginx e Ruby 1.9.2
Possiamo controllare eseguendo
ps aux | grep passenger-standalone
ed ottentendo qualcosa di simile a
railsusrX    15369  0.0  0.1  33588   804 ?        Ss   17:26   0:00 nginx: master process /home/railsusrX/.passenger/standalone/3.0.2-x86_64-ruby1.9.2-linux-gcc4.4.5-1002/nginx-0.8.53/sbin/nginx -c /tmp/passenger-standalone.9740/config -p /tmp/passenger-standalone.9740/
railsusrX    15622  0.0  0.1 112344   844 pts/1    S+   17:46   0:00 grep passenger-standalone


Adesso dobbiamo collegare i due webserver tramite reverse proxy.
Le prossime operazioni vanno eseguite come root o tramite sudo.
Creiamo il virtualhost di Apache in /etc/apache2/sites-available/web-app-X.it.vhost con il seguente contenuto
<VirtualHost *:80>
  ServerName web-app-X.it
  ServerAdmin silvio@web-app-X.it

  ErrorLog /var/log/apache2/testbox_error.log
  CustomLog /var/log/apache2/testbox_access.log combined

  DocumentRoot /home/railsusrX/sites/web-app-X/public

  PassengerEnabled off
  ProxyPass / http://127.0.0.1:3001/
  ProxyPassReverse / http://127.0.0.1:3001/
</VirtualHost>


Fate attenzione a porre una / in fondo agli indirizzi del proxy altrimenti gli asset del sito non saranno accessibili.

Attiviamo i moduli di Apache che si occupano di proxare e riavviamo Apache
a2enmod proxy
a2enmod proxy_http
a2enmod proxy_connect
/etc/init.d/apache2 restart


Infine abilitiamo il nuovo virtual host
a2ensite web-app-X.it.vhost
/etc/init.d/apache2 reload


Il deploy di versioni aggiornate della nostra applicazione web può essere fatto normalmente con Capistrano in quanto il webserver si riavvia col solito tocco (touch /home/railsusrX/sites/web-app-X/tmp/restart.txt)
 

Postato in ,  | Tag , , ,

Rails per Zombie

Scritto da Silvio Relli oltre 2 anni fa. Nov19

Rails for Zombies è l'ultima geniale trovata di Gregg Pollack al servizio della community di Ruby on Rails, il cui obiettivo è rendere l'apprendimento di Rails facile, divertente ed immediato.

R4Z fornisce infatti una bella serie di tutorial, con integrato al di sotto del video un piccolo ambiente di sviluppo web-based che consente di sperimentare Rails e i concetti appena appresi dallo screencast direttamente nel browser, senza dover configurare o installare alcunchè sul proprio sistema.

Ogni livello è accompagnato da vari Labs, o esercizi, da svolgere brevemente ed in maniera immediata, oltre a un intero pacchetto di slides sintetiche e un bel po di umorismo (in maniera simile alla celebre serie Scaling Rails).

Come in un videogioco, per poter passare al livello successivo è necessario completare il Lab, ma è possibile soffermarsi anche su alcuni esercizi facoltativi.

Con R4Z Gregg è veramente riuscito a reinventare l'utilizzo di screencast per insegnare Rails!

Per chi è totalmente a digiuno di Ruby on Rails consiglio di dare un occhiata anche a TryRuby in modo da familiarizzare col linguaggio alla base di Rails.
Anche TryRuby fornisce una console interattiva con cui provare Ruby e contiene un brevissimo tutorial di 15 minuti accessibile digitando 'help' nel terminale.
 

Postato in  | Tag , ,

Buco di sicurezza in Rails 2.3.9 e 3.0

Scritto da Silvio Relli oltre 2 anni fa. Oct18

E' stato scoperto che le versioni 2.3.9 e 3.0 di Rails contengono una vulnerabilità  nella gestione dei nested attributes che consente, tramite manipolazione dei parametri, di modificare record arbitrari sul sistema.

Versioni precedenti da quelle sopra menzionate non sono affette dal problema.

Sono state immediatamente rilasciate le versioni 2.3.10 e 3.0.1 per correggere la falla.

Postato in  | Tag , ,

Rilasciato Ruby on Rails 3.0

Scritto da Silvio Relli oltre 2 anni fa. Aug31

Ruby on rails 3.0

E' stata finalmente rilasciata la versione stabile di Ruby on Rails 3!

Date un'occhiata alle note di rilascio ufficiali ed agli screencast introduttivi alla nuova release:

 

Potete trovare tutti i video della serie Dive into Rails 3 nella pagina dedicata sul sito ufficiale, oppure seguire i sempre ottimi Railscast dedicati a Rails 3:

Postato in  | Tag

34 risorse per partire con Ruby on Rails 3

Scritto da Silvio Relli oltre 2 anni fa. Aug26

Visto l'imminente rilascio della versione finale di Ruby on Rails 3, ecco 34 utili risorse per partire (o proseguire) al meglio con lo sviluppo.

Panoramica

ActionController / Rack

ActionMailer

ActiveRecord / ActiveModel

Bundler

Railties

Routes

Plugins

Libri

  • Beginning Rails 3 - Cloves Carneiro Jr e Rida Al Barazi ci propongono un ottimo libro per principianti di Rails 3 con esempi visitabili come gists.
  • The Rails 3 Way - Il libro definitivo su Ruby on Rails da Obie Fernandez.
  • Rails 3 In Action - Ryan Bigg e Yehuda Katz ci forniscono un buon libro che spiega il Rails facendo BDD tramite Cucumber ed RSpec.
  • Rails 3 Upgrade Handbook - Il libro di Jeremy McAnally Jeremy offre 120 pagine di informazioni sull'aggiornamento di un'applicazione Rails 2 alla versione 3.
  • Ruby on Rails Tutorial: Learn Rails by Example - eBook di Hartl Michael che insegna il Rails passo dopo passo.

 

Fonte: Adventures In Coding

Postato in  | Tag , , , , , , , , , , , ,

Rilasciato Ruby 1.9.2

Scritto da Silvio Relli circa 3 anni fa. Aug18

Ruby 1.9.2E' stata appena rilasciata la versione stabile di Ruby 1.9.2.

Di seguito un estratto dalle note di rilascio ufficiali:

Ruby 1.9.2 is mostly compatible with 1.9.1, except the following changes:
* Many new methods
* New socket API (IPv6 support)
* New encodings
* Random class that supports various random number generators
* Time is reimplemented. There is no longer the year 2038 problem.
* some regexp enhancements
* $: no longer includes the current directory.
* dl is reimplemented on top of libffi.
* new psych library that wraps libyaml. You can use the library instead of syck.

Stranamente solo Debian a 32bit è considerata ufficialmente supportata, mentre OSX Leopard e Snow Leopard vengono considerati "best effort".

Sempre dalle note: "We verified that Ruby 1.9.2 works mostly fine on them. And I believe we can keep the 1.9.2 maintained on it."

Alte distribuzioni Linux ed altri sistemi non sono ufficialmente supportati, ma siamo invitati a testarli ed eventualmente a scrivere qualche patch.

 

Fonte: Note di rilascio ufficiali

Postato in  | Tag

Comoda e funzionale documentazione di Rails 3

Scritto da Silvio Relli circa 3 anni fa. Aug17

Rails searchable api documentation

Rails Searchable API Doc è una ottima documentazione in linea di Rails dotata di una comodissima funzione di ricerca.

Ricorda molto da vicino Railsbrain a cui ero piuttosto affezionato, che purtroppo però è rimasta ferma alla versione 2.3.2 di Rails.

La ricerca è piuttosto reattiva e scorrere tra i risultati risulta molto più intuitivo rispetto ad APIdock, un'altra risorsa simile.

Inoltre è possibile personalizzare il set della documentazione specificando la versione di Ruby, Rails ed includendo anche la documentazione di alcune delle gemme più diffuse come Authlogic, Rack, RSpec, Sinatra, Haml ed altre.

Alcuni esempi:

Postato in  | Tag , ,  | Nessun commento

string-utils: sanitificazione e trasformazione url friendly

Scritto da Silvio Relli circa 3 anni fa. Jun8

string-utils ruby gem

Oggi ho rilasciato la mia prima gemma, string-utils: essa contiene una semplice libreria che utilizzo in alcuni dei miei progetti.

Il suo compito principale è permettere la sanitificazione delle stringhe tramite l'helper sanitize (integrato in Rails a partire dalla versione 2.3.6 e 3.0 beta) anche all'interno di modelli e controllori.

Infatti come tutti gli helper, sanitize sarebbe disponibile solo all'interno delle viste, ma a volte mi è tornato utile sanitificare un input utente nel controllore, prima di lavorarci sopra, o magari anche nei modelli prima di salvarlo.

Una volta installata la gemma è possibile chiamare la funzione sanitize su qualsiasi stringa, in quanto la gemma consiste fondamentalmente in un'estensione della classe String.

Inoltre vengono rese disponibili due scorciatoie, "mia stringa".san che richiama sanitize effettuando la sanitificazione del testo e "mia stringa".hs che richiama html_safe.

Attenzione all'utilizzo di quest'ultima, in quanto non effettua la sanitificazione ma forza la stringa come html_safe senza effettuare controlli, utile soltanto quando si vuole evitare che venga effettuato l'escape di codice.

Infine la gemma fornisce la funzione urlify che rende una stringa url friendly sostituendo o cancellando caratteri indesiderati come lettere accentati e punteggiatura. Utile per creare pretty url!

Ad esempio "O come l'è GANZA 'sta gemma!".urlify restituisce "o-come-l-e-ganza-sta-gemma".

Potete installare la gemma tramite

sudo gem install string-utils --source http://gemcutter.org

oppure integrarla nel vostro progetto aggiungendola nel config/environment.rb con

config.gem 'string-utils', :source => "http://gemcutter.org"

Ulteriori esempi e sorgenti della gemma su Github: http://github.com/silviorelli/string-utils

Postato in  | Tag , ,

Installare Ruby on Rails su Mac Osx Snow Leopard

Scritto da Silvio Relli circa 3 anni fa. Jun3

Guida installazione rails leopard

Questa breve guida descrive come effettuare un'ottima installazione di Ruby a 64bit e tutto ciò che è necessario per iniziare a sviluppare con Ruby on Rails su Mac OSX.

Vedremo anche come installare MacPorts e MySQL dai sorgenti.

1) Installare Xcode 3.

L'installazione di Xcode si rende necessaria non tanto per l'editor stesso, quanto per l'insieme di librerie e tool che compongono l'SDK, come il compilatore gcc.

Potete trovare Xcode nel dvd di Snow Leopard oppure scaricare una versione aggiornata da qui: http://developer.apple.com/technologies/xcode.html (circa 2,3GB).

2) Installare Macports.

Macports è un tool che serve a scaricare, compilare e installare software opensource su Mac OSX.

Conosciuto fino a qualche anno fa come Darwin Ports, agisce in maniera simile ad Apt per Debian/Ubuntu o Yum per Redhat/Fedora risolvendo e scaricando le dipendenze del programma desiderato.

Scaricate l'immagine .dmg ed installate il .pkg in essa contenuto: http://www.macports.org/install.php

3) Settare le variabili d'ambiente.

Con il vostro editor preferito (Textmate regna!) dovrete aggiungere dei percorsi alla variabile PATH, la quale definisce le directory in cui il sistema cerca i programmi eseguibili da linea di comando.

Aprite dunque il terminale (Applicazioni/Utilità) e digitate:

mate ~/.profile 

La tilde ~ sulla tastiera italiana si ottiene premendo alt+5 ed identifica la vostra Home.

Se l'installazione di MacPorts è andata a buon fine noterete che il suo installer ha già provveduto ad aggiungere questa riga:

export PATH=/opt/local/bin:/opt/local/sbin:$PATH

In fondo al file aggiungete questa riga:

export PATH="/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin:$PATH"

Queste sono le directory dove finiranno i binari compilati di Ruby e MySQL.

Salvate il file e sempre da terminale eseguite

source ~/.profile

in modo da applicare le modifiche effettuate.

4) Qualche pacchetto necessario

Installiamo adesso qualche pacchetto da Port che si renderà utile in futuro: da terminale eseguite:

sudo port install curl git-core subversion bzip2

NON installate MySQL tramite Port, scaricheremo e compileremo il sorgente successivamente, in quanto l'installazione tramite Port a volte causa delle incompatibilità.

5) Download, compilazione e installazione di Ruby 1.8.7

mkdir ~/temp

cd ~/temp

curl -O ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p174.tar.gz

tar xzvf ruby-1.8.7-p174.tar.gz

cd ruby-1.8.7-p174

./configure --enable-shared --enable-pthread CFLAGS=-D_XOPEN_SOURCE=1

make

sudo make install

cd ..

6) Download, compilazione e installazione di Rubygems

curl -O http://files.rubyforge.vm.bytemark.co.uk/rubygems/rubygems-1.3.7.tgz

tar xzvf rubygems-1.3.7.tgz

cd rubygems-1.3.7

sudo /usr/local/bin/ruby setup.rb

cd ..

7) Installazione di Rails e Mongrel

Adesso che Rubygems è installato potete iniziare a usare il sistema di pacchettizazione gem per installare Rails e le altre gemme necessarie:

sudo gem install rails mongrel

Attendete prima di installare la gemma di MySQL, in quanto lo installeremo compilandolo dai sorgenti nel passo successivo.

8) Download, compilazione e installazione di MySQL

curl -O http://mysql.he.net/Downloads/MySQL-5.1/mysql-5.1.46.tar.gz

tar xzvf mysql-5.1.46.tar.gz

cd mysql-5.1.46

./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --enable-shared --with-plugins=innobase

make

sudo make install

cd /usr/local/mysql

sudo ./bin/mysql_install_db --user=mysql

sudo chown -R mysql ./var

cd ..

L'utente root di mysql per il momento è privo di password, opzionalmente potete settarla eseguendo:

mysqladmin -u root password 'miapassword'

Configuriamo launchctl in modo da avviare MySQL all'avvio del sistema:

curl -O http://hivelogic.com/downloads/com.mysql.mysqld.plist

sudo mv ./com.mysql.mysqld.plist /Library/LaunchDaemons

sudo chown root /Library/LaunchDaemons/com.mysql.mysqld.plist

sudo launchctl load -w /Library/LaunchDaemons/com.mysql.mysqld.plist

Installate infine la gemma MySQL di Ruby:

sudo gem install mysql -- --with-mysql-dir=/usr/local/mysql

Come client grafico per MySQL vi consiglio il validissimo Sequel PRO, un tempo conosciuto come Cocoa MySQL: http://www.sequelpro.com/

Postato in  | Tag , , , , ,