Iloo

https://iloo.wordpress.com

Ruby on Rails: autentificación con clearance

Un detalle que no falta casi en ninguna aplicación es la autentificación de usuarios, y para esto, rails tiene varias opciones (plugins), entre ellas:

Siendo los dos primeros los más usados y recomendados, pero en esta ocasión al ser realmente muy sencillo se usará clearance.
Primero las versiones de rails y ruby usadas son las siguientes:

Rails 3.1.0.rc5

ruby 1.9.2p290 (2011-07-09 revision 32553) [i686-linux]

Inicialmente se instalará la gem de clearance:

gem install clearance

La versión instalada en este momento es clearance (0.12.0).

Crear un nuevo proyecto (se usará SQLite3 como base de datos predeterminada):

rails new clearance-example

Posiblemente sea necesario instalar sqlite3-rails (ojo que requiere que se tenga instalado el paquete libsqlite3-dev):

gem install sqlite3-rails

Crear las “bases de datos”, como se esta usando SQLite3 simplemente es necesario crear archivos de texto vacios:

touch db/development.sqlite3
touch db/test.sqlite3
touch db/production.sqlite3

Es necesario modificar el archivo Gemfile (tal vez sea necesario también leer esto) y añadir la siguiente línea de código que indica que se usará clearance:

gem 'clearance'

Añadir al bundle:

bundle install

Ahora queda “instalar” clearance a la aplicación:

rails g clearance:install

Si todo salio se tendrá el siguiente mensaje en consola:

create  db/migrate/20110820010804_create_diesel_clearance_users.rb
      create  config/initializers/clearance.rb
      insert  app/controllers/application_controller.rb
      create  app/models/user.rb
      create  test/factories/clearance.rb

*******************************************************************************

Next steps:

1. Configure the mailer to create full URLs in emails:

     # config/environments/{development,test}.rb
     config.action_mailer.default_url_options = { :host => 'localhost:3000' }

   In production it should be your app's domain name.

2. Display flashes. For example, in your application layout:

    <% flash.each do |key, value| -%>
      <div class="flash <%= key %>"><%= value %></div>
    <% end -%>

3. Migrate:

     rake db:migrate

*******************************************************************************

Siguiendo los pasos 1, 2 y 3, indicados. Para el paso 3 se tiene la siguiente respuesta:

==  CreateDieselClearanceUsers: migrating =====================================
-- create_table(:users)
   -> 0.0040s
-- add_index(:users, :email)
   -> 0.0012s
-- add_index(:users, :remember_token)
   -> 0.0011s
==  CreateDieselClearanceUsers: migrated (0.0067s) ============================

Para generar las vistas de clearance:

rails g clearance:views

El resultado:

 create  app/views/clearance_mailer/change_password.html.erb
    conflict  app/views/layouts/application.html.erb
Overwrite /home/user/clearance-example/app/views/layouts/application.html.erb? (enter "h" for help) [Ynaqdh] Y
       force  app/views/layouts/application.html.erb
      create  app/views/passwords/create.html.erb
      create  app/views/passwords/edit.html.erb
      create  app/views/passwords/new.html.erb
      create  app/views/sessions/new.html.erb
      create  app/views/users/_form.html.erb
      create  app/views/users/new.html.erb

También es necesario modificar las rutas, añadiendo lo siguiente al archivo /config/routes.rb:

match '/sign_out' =>  'clearance/sessions#destroy'

Con eso ya estaría lista la nueva aplicación creada:

Para verificar que todo este funcionando, se va a crear un nuevo modelo llamado job usando el scaffolding de rails:

rails g scaffold Job name:string description:text

Y el resultado:

active_record
      create    db/migrate/20110820012510_create_jobs.rb
      create    app/models/job.rb
      invoke    test_unit
      create      test/unit/job_test.rb
      create      test/fixtures/jobs.yml
       route  resources :jobs
      invoke  scaffold_controller
      create    app/controllers/jobs_controller.rb
      invoke    erb
      create      app/views/jobs
      create      app/views/jobs/index.html.erb
      create      app/views/jobs/edit.html.erb
      create      app/views/jobs/show.html.erb
      create      app/views/jobs/new.html.erb
      create      app/views/jobs/_form.html.erb
      invoke    test_unit
      create      test/functional/jobs_controller_test.rb
      invoke    helper
      create      app/helpers/jobs_helper.rb
      invoke      test_unit
      create        test/unit/helpers/jobs_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/jobs.js.coffee
      invoke    scss
      create      app/assets/stylesheets/jobs.css.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.css.scss

Seguidamente es necesario migrar la base de datos:

rake db:migrate

Para “asegurar” las acciones dentro del controlador jobs, se debe añadir lo siguiente al archivo /app/controller/jobs_controller.rb justo después de la línea class JobsController < ApplicationController:

before_filter :authorize

Para definir la página de inicio (root) la acción index del controlador jobs es necesario volver a modificar el archivo /config/routes.rb (también se debe borrar el archivo /public/index.html):

root :to => 'jobs#index'

El algoritmo que sigue al ingresar a la aplicación sería el siguiente:

Si el usuario ha iniciado sesión entonces: ingresa a /jobs/index

Si no: ingresa a /sign_in

Hasta aquí todo, casi todo estaría funcionando, lo que no funciona es eliminar los registros jobs, para arreglar esto es necesario añadir lo siguiente al layaout principal (en este caso el archivo /app/views/layouts/default.html.erb), tiene que estar contenido entre las etiquetas <head></head>:

<%= javascript_include_tag "application" %>

Finalmente para levantar el servidor:

rails s

El ejemplo completo en git:

Y el demo:

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s