Ejercicio con Active_Scaffold plugin + Rails

0
522
pantalla1

Me he encontrado este plugin que nos ayuda a genera una vista muy buena con ajax en ruby on rails a continuacion describo un pequeño ejemplo de como usarla

Problema: mostrar dos tablas relacionadas que nos permitan visualizar a un usuario y su rol en una mismo grid provenientes estos datos de tablas diferentes

Comenzamos

Creamos nuestro proyecyto rails indicando que sera para ser usado con Mysql:


fvasquez@fvasquez:/var/www/rails$ rails -d mysql sav


Creamos nuestra base de datos:


fvasquez@fvasquez:/var/www/rails$ sudo mysqladmin create sav -p
Enter password:


Editamos el archivo database.yml para indicarle los datos necesarios, database y password


fvasquez@fvasquez:/var/www/rails/sav$ nano config/database.yml

# MySQL. Versions 4.1 and 5.0 are recommended.
#
# Install the MySQL driver:
# gem install mysql
# On Mac OS X:
# sudo gem install mysql — –with-mysql-dir=/usr/local/mysql
# On Mac OS X Leopard:
# sudo env ARCHFLAGS=”-arch i386″ gem install mysql — –with-mysql-config=/usr/local/mysql/bin/mysql_config
# This sets the ARCHFLAGS environment variable to your native architecture
# On Windows:
# gem install mysql
# Choose the win32 build.
# Install MySQL and put its /bin directory on your path.
#
# And be sure to use new-style password hashing:
# http://dev.mysql.com/doc/refman/5.0/en/old-client.html
development:
adapter: mysql
encoding: utf8

database: sav
username: root
password: 123456
socket: /var/run/mysqld/mysqld.sock

# Warning: The database defined as ‘test’ will be erased and
# re-generated from your development database when you run ‘rake’.
# Do not set this db to the same as development or production.
test:
adapter: mysql
encoding: utf8

database: sav
username: root
password: 123456
socket: /var/run/mysqld/mysqld.sock

production:
adapter: mysql
encoding: utf8
database:
sav
username: root
password:
123456
socket: /var/run/mysqld/mysqld.sock


Vamos a crear ahora nuestros modelos y controladores para cada una de las tablas

que en este caso seran Usuario y Rol


fvasquez@fvasquez:/var/www/rails/sav$ ./script/generate model Usuario
fvasquez@fvasquez:/var/www/rails/sav$ ./script/generate controller Usuario
fvasquez@fvasquez:/var/www/rails/sav$ ./script/generate model Rol
fvasquez@fvasquez:/var/www/rails/sav$ ./script/generate controller Rol


Ahora vamos a crear los archivos de migracion para crear las tablas de Usuario y Rol

Editamos los siguientes archivos y los dejamos como se muestra


fvasquez@fvasquez:/var/www/rails/sav$ nano db/migrate/001_create_usuarios.rb


class CreateUsuarios < ActiveRecord::Migration
def self.up
create_table :usuarios do |t|
t.string :nombre
t.string :apellido
t.string :usuario
t.integer :rol_id

t.timestamps
end
end

def self.down
drop_table :usuarios
end
end

fvasquez@fvasquez:/var/www/rails/sav$ nano db/migrate/002_create_rols.rb

class CreateRols < ActiveRecord::Migration
def self.up
create_table :rols do |t|
t.string :rol
t.string :descripcion

t.timestamps
end
end

def self.down
drop_table :rols
end
end


Y migramos a nuestra base de datos las tablas


fvasquez@fvasquez:/var/www/rails/sav$ rake db:migrate
(in /var/www/rails/sav)
== 1 CreateUsuarios: migrating ================================================
— create_table(:usuarios)
-> 0.0501s
== 1 CreateUsuarios: migrated (0.0505s) =======================================

== 2 CreateRols: migrating ====================================================
— create_table(:rols)
-> 0.0242s
== 2 CreateRols: migrated (0.0245s) ===========================================


Con esto ya tenemos creadas nuestras tablas dentro de la base de datos SAV

Ahora vamos a realizar las relaciones entre tablas que queremos tener
como la relacion que estoy proponiendo es de uno a muchos vamos a hacer los siguientes pasos:

Editamos nuestros modelos


fvasquez@fvasquez:/var/www/rails/sav$ nano app/models/rol.rb

class Rol < ActiveRecord::Base
has_many :usuario
end

fvasquez@fvasquez:/var/www/rails/sav$ nano app/models/usuario.rb


class Usuario < ActiveRecord::Base
belongs_to :rol
end


Esto quiere decir que un usuario puede tener muchos rols

Ahora vamos a instalar la version mas reciente del plugin active_scaffold


fvasquez@fvasquez:/var/www/rails/sav$ ./script/plugin install http://activescaffold.googlecode.com/svn/tags/active_scaffold


Y seguimos los pasos que nos idican en el sitio del plugin


fvasquez@fvasquez:/var/www/rails/sav$ nano app/controllers/usuario_controller.rb

class UsuarioController < ApplicationController
active_scaffold :usuario do |config|

config.columns = [:nombre, :apellido, :usuario, :rol]
config.list.sorting = [{:nombre => :desc}]
config.actions.swap :search, :field_search

config.columns[:rol].form_ui = :select
config.columns[:rol].search_sql = ‘rols.id’

end
end

fvasquez@fvasquez:/var/www/rails/sav$ nano app/controllers/rol_controller.rb

class RolController < ApplicationController
active_scaffold :rol
end

fvasquez@fvasquez:/var/www/rails/sav$ nano app/views/layouts/application.rhtml


“http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>

Usuarios y Roles
<%= javascript_include_tag :defaults %>
<%= active_scaffold_includes %>

<%= yield %>



Agregamos a nuestro archivo de ruras los mapeos correspondientes a nuestros metodos usuario y rol


fvasquez@fvasquez:/var/www/rails/sav$ nano config/routes.rb


ActionController::Routing::Routes.draw do |map|

map.resources :usuario

map.resources :rol

map.connect ‘:controller/:action/:id’
map.connect ‘:controller/:action/:id.:format’
end

 

Inicializamos el servidor para ver nuestra aplicacion


fvasquez@fvasquez:/var/www/rails/sav$ ./script/server



Y probamos la aplicacion corriendo esto http://localhost:3000/usuario

Al parecer todo funciona solo con un detalle cuando tratamos de ingresar el campo relacionado de
la tabla rol obtenemos la referencia al campo mas no el valor del campo algo como esto
#

Esto se soluciona de la siguiente manera

Editamos nuestro modelo rol.db y lo dejamos como se muestra a continuacion, con esto le indicamos que se nos muestre el valor de rol no su referencia


fvasquez@fvasquez:/var/www/rails/sav$ nano app/models/rol.rb

class Rol < ActiveRecord::Base
has_many :usuarios

def to_label
“#{rol}”
end


Aqui tenemos una captura de nuestra pantalla

 

pantalla1

 

aqui tentemos otra captura de nuestra pantalla

 

pantalla2

 

y listo ya tienen una pequeña aplicacion corriendo con Active_scaffold

Como siempre espero les sirva este procedimiento…

Atte Faustino Vasquez Limon

Linux User

LEAVE A REPLY

Please enter your comment!
Please enter your name here