%p %a{:href=>'https://github.com/jo/puret'} Puret è una gemma ruby che ci aiuta a localizzare i valori contenuti nel nostro database. %br Supponiamo di avere un modello News con un titolo, un abstract ed un body. Se il nostro scopo è mostrare contenuti differenti in base alla lingua del locale del nostro utente, la scelta che %em non dobbiamo fare è quella di duplicare i dati all'interno del modello news. Gemme come puret sono nate per aiutarci in questo. %p Piccola premessa, sto scrivendo il nuovo sito per %a{:href=>'http://www.armoredcode.com'} armoredcode.com e per farlo sto usando %a{:href=>'http://www.padrinorb.com/'} padrino al posto di %a{:href=>'http://rubyonrails.org/'} rails per una questione di semplicità. E' solo un sito vetrina con pochi contenuti inseriti da backend, un framework come padrino fa abbondantemente il suo dovere. %p Come ORM sto usando ActiveRecord al posto di DataMapper, che di solito preferisco usare quando non lavoro con Rails, perché me lo richiedeva la gemma %a{:href=>'https://rubygems.org/gems/acts-as-taggable-on-padrino'} act-as-taggable per padrino. %p Questo mi torna comodo perché come ORM va bene anche per puret. %br Ho un modello News che ha veramente i campi titolo, abstract e body che voglio rendere disponibili in italiano ed inglese. %br Vediamo come. %p Per prima cosa aggiungiamo puret al nostro Gemfile e lanciamo il comando %code bundle install %pre %code{:class=>'language-ruby coderay'} :escaped gem 'puret' %p Se fossi in rails, potrei avvalermi dei generatori di puret e scrivere %pre %code{:class=>'language-ruby coderay'} :escaped rails generate puret:model News title:string abstract:text body:text %br Questo farebbe per me un po' di operazioni che vedremo ho dovuto fare a mano, come ad esempio modificare il modello News, generare il modello NewsTranslation e la migrazione ad esso associata. %p Partiamo. Come prima cosa devo dire al mio modello che deve chiedere a puret di gestire alcuni dei suoi campi. %br Questo %em non implica alcuna nuova migrazione. Solo una modifica al file del modello. %pre %code{:class=>'language-ruby coderay'} :escaped class News < ActiveRecord::Base puret :title, :abstract, :body scope :to_homepage, where(:homepage=>:true).order(":updated_at DESC").limit(2) end %p Fatta questa modifica, devo generare un modello per la tabella delle traduzioni, tabella che verrà creata dopo con una migrazione ad hoc. %pre %code{:class=>'language-ruby coderay'} :escaped padrino g model NewsTranslation %br Il nostro modello sarà molto semplice: %pre %code{:class=>'language-ruby coderay'} :escaped class NewsTranslation < ActiveRecord::Base puret_for :news end %p Ok, creato il modello creo una migrazione associata ad esso %pre %code{:class=>'language-ruby coderay'} :escaped padrino g migration CreateNewsTranslations %br Il contenuto della migrazione lo si può desumere dalla documentazione di %a{:href=>'https://github.com/jo/puret'} puret. %br %pre %code{:class=>'language-ruby coderay'} :escaped class CreateNewsTranslations < ActiveRecord::Migration def self.up create_table(:news_translations) do |t| t.references :news t.string :locale t.string :title t.text :abstract t.text :body t.timestamps end add_index :news_translations, [:news_id, :locale], :unique => true end def self.down drop_table :news_translations end end %br Ora non basta fare altro che eseguire le migrazioni per rendere effettivi i cambiamenti. %pre %code{:class=>'language-ruby coderay'} :escaped padrino rake ar:migrate %p Finito? Non ancora, un ultimo step. Padrino ti da la possibilità di generare un backend per i tuoi progetti per fare la parte di data entry e gestione dei dati associati ai tuoi modelli. Un po' quello che ti permette di fare %a{:href=>'http://pilu.github.com/web-app-theme/'} web app theme per rails. %br E' veramente una feature molto comoda e semplice da utilizzare. %p E' possibile creare il backend (che di fatto è un'applicazione standalone sinatra come tutte le applicazioni che potete creare all'interno di un progetto in padrino) con il comando %pre %code{:class=>'language-ruby coderay'} :escaped padrino g admin %br Una volta fatto questo, potete creare una pagina di amministrazione per un modello semplicemente con il comando: %pre %code{:class=>'language-ruby coderay'} :escaped padrino g admin_page NewsTranslation %p Abbiamo quindi ora un backend dove inserire le news e le relative traduzioni. Le possibilità di customizzazione sono ora infinite, diciamo che da qui potete partire. %br %em Come fa padrino a capire cosa mostrarvi quando accedete ad una news? Semplice. Guarda il valore di I18n.locale. Io ho impostato nel mio controller il seguente filtro in maniera tale che si possa cambiare il locale dall'url. %pre %code{:class=>'language-ruby coderay'} :escaped before do I18n.locale= params[:locale] || I18n.default_locale end %p Ora è veramente tutto per oggi. Scrivete codice sicuro mi raccomando. %em E state pronti per novità sorprendenti.