|
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
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <title>Usuarios y Roles</title> <%= javascript_include_tag :defaults %> <%= active_scaffold_includes %> </head> <body> <%= yield %> </body> </html>
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 #<Rol:0x7fc0213b4550>
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 aqui tentemos otra captura de nuestra pantalla 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
|