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
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