Click here to load reader

Sviluppo web con Ruby on Rails - · PDF fileVede persone e fa cose ... Ruby on Rails - fu? “Ruby on Rails is astounding. Using it ... Rails integra tre tipi di tests:

  • View
    222

  • Download
    0

Embed Size (px)

Text of Sviluppo web con Ruby on Rails - · PDF fileVede persone e fa cose ... Ruby on Rails - fu?...

Sviluppo web con Ruby on Rails

Chi vi parlaChi vi parla Alessandro `jekil` Tanasi

Vede persone e fa cose

Non sviluppa siti web ma ha delle web-esigenze da soddisfare (chi non le ha?)

Senza perdere tempo e nel modo pi efficace possibile

Ruby on Rails

Ruby on Rails - fu?Ruby on Rails - fu?Ruby on Rails is astounding. Using it is like watching a kung-fu movie,where a dozen bad-ass frameworks prepare to beat up the little newcomer only to be handed their asses in a variety of imaginative ways.(Nathan Torkington, O'Reilly Program Chair for OSCON)

Ruby on RailsRuby on RailsRuby on Rails un framework per lo sviluppo

di applicativi web

Basato su Ruby

Open source

Pensato per massimizzare la produttivit

Progettato pensando alla felicit del programmatore

http://rubyonrails.org/screencasts

Perch Rails...

La forza di RailsLa forza di Rails Ruby

Convention over configuration

Best practices: MVC, DRY, Testing

Astrazione (SQL, Javascript, ..)

Integrazione con AJAX e REST

Metodologie agile

InstallazioneInstallazione Interprete Ruby

apt-get install ruby Compilazione dei sorgenti IstantRails su Windows Locomotive su OSX

Ruby on Rails

DBMS

SQLite, MySQL, Postgres e altri Editor di testo

TextMate, jEdit, Scite, NetBeans, Aptana, vim, emacs

Let's go!

Struttura directoryStruttura directoryapp controllers helpers models views layoutsconfig environment.rb routes.rbdb database.yml migrationsliblogpublicscripttestvendor plugins rails

Migrations

MigrationsMigrations Evoluzione del database schema nel tempo

Definite indipendentemente dal DBMS sottostante

script/generate migration

Ogni migrazione numerata e applicata sequenzialmente

La migrazione pu essere reversibile

I dati evolvono con la migrazione

rake db:migrate VERSION=X

EsempioEsempioclass CreateUsers < ActiveRecord::Migration def self.up create_table "users", :force => true do |t| t.string :login, :null => false t.string :email, :null => false t.string :salt, :null => false, :limit => 40 t.string :remember_token t.datetime :remember_token_expires_at t.string :password_reset_code, :limit => 40 t.timestamps end add_index :users, :login add_index :users, :enabled end

def self.down drop_table "users" endend

RakeRakeUtility per lo svolgimento di task

db:migrate

db:sessions:create

doc:app

doc:rails

log:clear

rails:freeze:gems

rails:freeze:edge

rails:update

:test (default task)

:stats

Scaffolding

ScaffoldScaffold Creazione automatizzata dell'interfaccia

web di un dato modello

Utile per strumenti che devono essere usabili da subito e con il minimo sforzo

Possibilit di personalizzazioni

Rapidit di sviluppo

ruby script/generate scaffold antani

Modelli

ActiveRecordActiveRecord Ogni tabella del database mappata con

una classe

I nomi delle tabelle sono al plurale mentre le classi dei modelli sono al singolare

Ogni tabella ha un campo primary key chiamato id

La mappatura permette di eseguire operazioni trattando i dati come oggetti

Permette di definire costrutti e condizioni sui dati

FindersFinders User.find(:all)

User.find(:all, :limit => 10)

Dynamic finders

User.find_all_by_last_name Hanson

User.find_by_age 20

User.find_by_first_name_and_last_name Andreas, Kviby

AssociazioniAssociazionihas_one :credit_card, :dependent => :destroy

has_many :comments, :include => :authorhas_many :people, :class_name => "Person", :conditions => "deleted = 0", :order => "name"has_many :tracks, :order => "position", :dependent => :destroyhas_many :comments, :dependent => :nullifyhas_many :tags, :as => :taggablehas_many :subscribers, :through => :subscriptions, :source => :userhas_many :subscribers, :class_name => "Person", :finder_sql => 'SELECT DISTINCT people.* ' + 'FROM people p, post_subscriptions ps ' + 'WHERE ps.post_id = #{id} AND ps.person_id = p.id ' + 'ORDER BY p.first_name'

ValidazioniValidazioni Regole di validazione del modello che

proteggono l'integrit dei dati

La validazione viene eseguita al salvattaggio e modifica di dati

E' fondamentale che ogni dato sia sempre validato

Es. nomi utente univoci

Es. campi che devono essere solo numerici

ValidatoriValidatori validates_acceptance_of

validate_associated

validates_confirmation_of

validates_each

validates_exclusion_of

validates_format_of

validates_inclusion_of

validates_length_of

validates_numericality_of

validates_presence_of

validates_size_of

validates_uniqueness_of

EsempioEsempioclass User < ActiveRecord::Base

validates_presence_of :login, :email validates_presence_of :password, :if => :password_required? validates_presence_of :password_confirmation, :if => :password_required?

validates_length_of :login, :within => 3..40 validates_length_of :email, :within => 3..100 validates_uniqueness_of :login, :email, :case_sensitive => false validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i, :message => "Indirizzo email non valido" validates_format_of :login, :with => /^[\w\d\-\_]+$/, :message => "Sono permessi solo lettere" before_save :encrypt_password has_one :country has_many :photos has_one :profile, :dependent => :nullify

Controller

ActiveControllerActiveController I controller sono classi Ruby in

app/controllers

Ad ogni suo metodo pubblico corrisponde una vista

Gestiscono le azioni che si compiono sui dati

Gestiscono tutte le interazioni logiche

Es. un utente compra un oggetto

Es. un utente si iscrive al sito

Flash messagesFlash messages Permettono di impostare un messaggio da

mostrare all'utente nella gestione di una richiesta e visualizzarlo nella successiva

Varie priorit flash[:notice], flash[:error]

Utilizzati per azioni che richiedono un feedback dopo un submit

Es. Compilazione di un ordine online

Es. Login di un utente

EsempioEsempioclass LinksController < ApplicationController def index @user = User.find_by_id(params[:user_id]) @links = @user.links end def latest n = 10 @links = Link.find(:all, :order => 'created_at ASC', :limit => n) endend

Views

ActionViewActionView Si occupa del rendering della risposta al

client

Rendering basato su template

Permesso l'uso di codice all'interno dei template

Il controller sceglie quale template visualizzare

Le view hanno accesso alle variabili d'istanza (ad es. @pluto)

Tipi di templateTipi di template Rxml genera output XML. Tipicamente

usato per generare feed RSS/Atom

Rhtml genera output HTML

Rjs genera codice Javascript. Utilizzato per AJAX

HTML templateHTML template valuta l'espressione e

stampa l'output

valuta l'espressione e stampa l'output senza un newline a fine riga

valuta l'espressione e non stampa l'output

escaping dell'output

PartialsPartials Parti di una pagina (ad es. footer)

Possono essere inclusi in una o pi pagine

Funzionano come i template

Il loro nome inizia con un underscore

Vengono utilizzate per le parti di codice condivise che devono essere riciclate nell'applicazione

Es. search box

Es. header e footer

LayoutLayout I template del layout si trovano in

/app/views/layout

Il posizionamento di tag permette la visualizzazione delle parti di codice generate

visualizza l'output di una view

Permettono di uniformare il layout del sito e se desiderato di personalizzarlo in alcune sue zone

EsempioEsempio

'rss', :action => 'category', :id => 1 %> Papers

'table' %>

'documents', :action => 'category', :id => 1 %>

'rss', :action => 'category', :id => 2 %> Slides

'table' %>

'documents', :action => 'category', :id => 2 %>

'rss', :action => 'category', :id => 3 %> Videos

Helpers

HelpersHelpers Moduli Ruby che definiscono metodi

disponibili nei template

Evitano duplicazione di codice

Riducono il codice nei template

Per default ogni controller ha un helper corrispondente

Usati per definire le funzionalit comuni

Es. loggato un utente?

Es. pagina successiva

EsempioEsempiomodule ApplicationHelper

# Check if a parameter is nil, if it's print - else print the value. NilPrintCheck def npc(var) if var.nil? or var.empty? return '-' else return var end end

Testing

TestingTesting Test::Unit una libreria Ruby per unit

testing

Rails integra tre tipi di tests:

Uni tests (test sul modello) Integration tests (test di integrazione) Functional tests (test sul controller)

Ogni test deve iniziare per test_

Prima dell'esecuzione di ogni test viene chiamato il medoto setup e alla sua conclusione il met

Search related