Ruby on Rails Dojo

19.06.2007

5th step: modifiche e nuovo layout

Filed under: semilla — carlos @ 8:32

Eccomi di nuovo con ulteriori modifiche apportate a Semilla.
Dal momento che il codice aggiunto comincia ad essere (relativamente) tanto, evito di postarlo sul blog limitandomi a citare i file sui quali sono intervenuto.

Anzitutto modifico il file config/routes.rb per fare in modo che la pagina di default sia account/signup.

Vi è la necessità di un layout “omogeneo” per tutte le pagine dell’applicazione, così imposto un file app/views/layouts/application.rhtml ed un opportuno foglio di stile (public/stylesheets/style.css). Durante lo sviluppo accedo spessp a questi file per adattare (in modo try-and-modify) il layout alle mie esigenze (man mano che le scopro!).

Adesso passo ad implementare della “logica”. Semplifico il form di signup in modo che chieda solo le informazioni minime per creare un account (indirizzo email e password); una volta efettuato il login sarà possibile editare il proprio profilo per modificare gli altri dati (first name, last name e screen name).
Lo screen name è un semplice nick da mostrare all’interno dell’applicazione al posto dell’indirizzo email, e per “invogliare” l’utente a modificarlo lo imposto inizialmente uguale proprio all’indirizzo email (v. metodo signup in app/controllers/account_controller.rb).
Per tenere traccia di questi nuovo campo devo aggiungere una colonna alla tabella users e così utilizzo una migration opportuna….e scopro che sqlite non supporta gli ALTER TABLE (mia ignoranza o cosa?). Comunque sia passo a MySQL…

Continuo impostando l’azione account/edit per permettere all’utente (loggato) di modificare i propri dati. Da notare l’utilizzo di un filtro per proteggere il tutto:

before_filter :login_required, :only => [ :edit, :index, :logout ]

Infine implemento un task rake per fare in modo che il monkey-utente possa facilmente installare l’applicazione utilizzando un database MySQL (e qui facciamo un atto di fede…).
Il task si trova in lib/tasks/semilla.rake, probabilmente è migliorabile e non troppo rubyista infatti:

  • non ho avuto modo di provarlo sotto Windows
  • non salva una copia del file config/database.yml prima di sovrascriverlo

Il task è invocabile da rake utilizzando $ rake semilla:mysql.

Intanto Semilla si presenta così

semilla signup

e non mi dispiace affatto!

Alla prossima!

18.06.2007

primo feedback

Filed under: semilla — kiaroskuro @ 4:34

Ho appena ricevuto da Carlo la prima versione di semilla, configurata, runnata, funzionante!

Ci sono alcune modifiche da fare da subito per renderla però più monkey-friendly.

  1. il file database.yml datomi da Carlo conteneva configurazioni per sqlite. La vera scimmia ha installato Rails probabilmente con InstantRails e ha MySQL di default. Semilla dovrebbe defaultare a MySQL e avere eventualmente dei task rake per settare un diverso DB adapter.
  2. l’environment di Carlo conteneva rails 1.2.2, mentre io ero uptodate alla 1.2.3. O si freeza rails nel vendor/ di semilla o si deve rimanere aggiornati all’ultima versione. Per chi sa che fare si tratta di una cavolata, ma questa è una coltellata che potrebbe uccidere la scimmia.
  3. lo screen di entrata è per il signup. La form è un pò lunga. Semplifichiamo le cose drasticamente per catturare il monkey-utente e farlo iscrivere:
  • niente username e lastname in questa schermata. una volta registratosi l’utente potrà settare il proprio profilo
  • niente login name separato dall’email. L’email è uno unique identifier e sarà uguale al login name. Nel
    profilo utente poi,sarà possibile settare uno screen-name che identificherà l’utente in modo più gradevole che non l’email

Nuove cose da implementare invece saranno:

  1. nella prima schermata oltre a esserci il signup dovrebbe esserci anche un ‘login’
  2. una volta entrati serve un tasto di logout
  3. sfruttare il tastino di ‘remember me’ che dovrebbe autogenerare act_as_authenticated

bene, questo dovrebbe tenere impegnato Carlo per almeno altri 2-3 giorni 🙂

4th step: test, test, test!

Filed under: semilla — carlos @ 3:37

Bene, abbiamo detto di voler (anzi dove) aggiungere i test per coprire le funzionalità appena introdotte.
Anzitutto il modello: abbiamo modificato il file app/models/user.rb aggiungendo i campi obbligatori first_name e last_name, pertanto dobbiamo verificare che l’assenza di questi due parametri sia vincolante per il signup. Aggiungiamo i seguenti metodi alla classe UserTest (file test/unit/user_test.rb):

def test_should_require_first_name
  assert_no_difference User, :count do
   u = create_user(:first_name => nil)
  assert u.errors.on(:first_name)
  end
end


def test_should_require_last_name
  assert_no_difference User, :count do
   u = create_user(:last_name => nil)
  assert u.errors.on(:last_name)
  end
end

e modifichiamo il metodo create_user:


def create_user(options = {})
  User.create({ :first_name => 'mario', :last_name => 'rossi', :login => 'quire', :email => 'quire@example.com', :password => 'quire', :password_confirmation => 'quire' }.merge(options))
end

dove abbiamo aggiunto i suddetti campi.

A questo punto lanciano il comando:

$ rake test:units

non dovremmo avere problemi.

Discorso analogo per il controller: adesso siamo “sicuri” che il modello si comporta correttamente, ma non possiamo ancora dire altrettanto per la logica dell’applicazione.
Apriamo il file test/functional/account_controller_test.rb ed aggiungiamo i due metodi:

def test_should_require_first_name_on_signup
  assert_no_difference User, :count do
   create_user(:first_name => nil)
   assert assigns(:user).errors.on(:first_name)
   assert_response :success
  end
end


def test_should_require_last_name_on_signup
  assert_no_difference User, :count do
   create_user(:last_name => nil)
   assert assigns(:user).errors.on(:last_name)
   assert_response :success
  end
end

anche qui modifichiamo il metodo privato create_user agiungendo un default per i suddetti campi:

def create_user(options = {})
  post :signup, :user => { :first_name => 'mario', :last_name => 'rossi', :login => 'quire', :email => 'quire@example.com',
:password => 'quire', :password_confirmation => 'quire' }.merge(options)
end

e verifichiamo lanciando il comando:

$ rake test:functionals

Per natura sono un po’ diffidente/paranoico… quindi controllo con il browser se l’applicazione continua a funzionare anche dopo aver aggiunto i test: tutto ok, funziona 😉 !

« Pagina precedentePagina successiva »

Crea un sito o un blog gratuitamente presso WordPress.com.