Bienvenido a   :: LINUX SOLUTIONS CENTER ::

México,  Viernes 21 de Noviembre del 2008   
  Hora Local
Home Programacion COMO crear aplicacion Ajax Scaffold y Ruby on rails
LINUX es nuestra Especialidad: · Servidores de Internet · Monitoreo de Servidores y Enlaces · Virtualizacion · Firewalls con OpenSource · Proxy Servers (Web Cache) · DNS y DHCP · Web Server · Webmail · NAT's · IP Forwarding · FTP Server · Email Attachmnt Filtering · Reportes estadisticos · Linux Gateway/Router · Bloqueo de Puertos · Email Server · Reporte de todo el trafico interno/externo · Administracion de Ancho de banda · VPN's con Open VPN · Soporte Ténico comercial · Administración de servidores Linux (RedHat EL/AS, Debian, CentOs, etc) · Instalación y Configuración de Servidores · Configuración de servidores de E-Mail (Sendmail, Qmail, Postfix con virtual domains) · Antvirus con OpenSource · Administración de LVM · y mas... mucho mas
Linux Solutions C.
Acerca de
Actualidad
GNU/Linux
Gente en Línea
Tenemos 43 invitados conectado
Estadísticas
Ver contenido por hits : 192390
Acceso



Google Translation

 
Temas Relacionados

GULEV | Software Libre


Banner Advertisement
COMO crear aplicacion Ajax Scaffold y Ruby on rails PDF Imprimir E-mail
Programacion Unix-Linux
Escrito por Fvasquez   
Sábado, 02 de Febrero de 2008 20:35

Bueno aquí me tienen de nuevo dando lata...

Hace tiempo puse un pequeño COMO de la instalación de Ruby+ Mongrel

Bueno pues vamos a hora a ver como hacer una pequeña aplicación integrando Ajax y la clase de Rico que viene integrado con la gema ajax_scaffold_generator


Manos a la obra ... Sonriente

Lo que intentaremos hacer integrarle un rol a un usuario...

Para esto creamos nuestra base de datos y unas tablas

Yo le llame sav a la base de datos y cada tabla se llama usuarios y rols respectivamente respetando la nomenclatura que indica ruby.

Pues creamos nuestra base de datos;

fvasquez@inf:~$ mysqladmin create sav

Ahora las tablas

Creamos un archivo y escribimos lo siguiente

fvasquez@inf:~$ nano tablas.sql


CREATE TABLE `rols` (
`rol` varchar(30) NOT NULL,
`descripcion` varchar(50) NOT NULL,
`id` int(11) NOT NULL auto_increment,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Roles para Usuarios' AUTO_INCREMENT=1;

CREATE TABLE `usuarios` (
`nombre` varchar(50) NOT NULL,
`apellido` varchar(50) NOT NULL,
`usuario` varchar(20) NOT NULL,
`password` varchar(60) NOT NULL default '',
`rol_id` int(11) NOT NULL,
`id` int(11) NOT NULL auto_increment,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Usuarios del sistema' AUTO_INCREMENT=1


Ahora lo volcamos a la base de datos

fvasquez@inf:~$ sudo mysql < tablas.sql


Ya tenemos nuestras tablas....

Ahora vamos a actualizar nuestras gemas e instalar ajax_scaffold_generator

fvasquez@inf:~$ sudo gem update

fvasquez@inf:~$ sudo gem install ajax_scaffold_generator


Parece que todo va bien por aquí....

Ahora vamos a crear nuestra aplicación con rails

fvasquez@inf:~$ rails sav
fvasquez@inf:~$ cd sav


Editamos el archivo database.yml y lo dejamos como se muestra continuación

fvasquez@inf:~/sav$ nano config/database.yml

development:
adapter: mysql
database: sav
username: root
password:
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
database: sav
username: root
password:
socket: /var/run/mysqld/mysqld.sock

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




Ahora vamos a lo mas agradable.. que nos genere el codigo de la taba rols

fvasquez@inf:~/sav$ ruby script/generate ajax_scaffold Rol

Y eso es mas o menos todo, tendremos una aplicación funcionando con una visualización bastante buena, aunque faltaria por ejemplo validar campos entre otras cosas

Prendemos nuestro servidor para visualizar lo que tenemos

fvasquez@inf:~/sav$ ruby script/server mongrel -d

Vamos al navegador y ponemos lo siguiente

http://localhost:3000/rols/

Juguemos un rato con esta aplicación y agreguemos unos cuantos registros y vamos al siguiente paso....

Ahora hacemos el scaffold para la tabla usuarios

fvasquez@inf:~/sav$ ruby script/generate ajax_scaffold Usuario

Vamos al navegador y ponemos lo siguiente

http://localhost:3000/usuarios/

Tratemos de agregar algún usuario y al parecer todo esta bien... Pero no... si nos damos cuenta tenemos un campo el cual no aparece y que es el de rol_id, y no aparece porque es un campo numérico y al contener solo números parecería no relevante pero vamos a hacer que lo sea y a también a desplegarlo en la tabla...

Queremos que en el campo rol_id se almacene el id de la tabla rols pero en la visualizacion nos muestre el campo rol en el select

Esto se pone interesante...
Bien pues manos a la obra...


Primero debemos ver es como va a ser la relación

Un usuario tiene un único rol y un mismo rol puede pertenecer a varios usuarios.


Para esto editamos los archivos /models/rol.rb y /models/usuario.rb y los dejamos como se muestra a continuación


fvasquez@inf:~/sav$ nano app/models/rol.rb

require 'ajax_scaffold'

class Rol < ActiveRecord::Base
has_many :usuarios
end

fvasquez@inf:~/sav$ nano app/models/usuario.rb


require 'ajax_scaffold'

class Usuario < ActiveRecord::Base
belongs_to :rol, :foreign_key => "rol_id"
end


Las declaraciones anteriores nos permiten generar nuevos métodos y caminar atraves de estas relaciones desde ruby.

Por ejemplo, desde un objeto @usuario se puede averiguar que rol es el que tiene por medio de @usuario.rol.rol


Ahora necesitamos agregar un campo select que nos permita seleccionar el rol que tiene un usuario...

Para esto editamos el archivo _form.rhtml y lo dejamos como se muestra

fvasquez@inf:~/sav$ nano app/views/usuarios/_form.rhtml

<fieldset>
<div class="row">
<!--[form:usuario]-->
<div class="form-element">
<label for="usuario_nombre">Nombre</label>
<%= text_field 'usuario', 'nombre' , {:class=>"text-input"} %>
</div>

<div class="form-element">
<label for="usuario_apellido">Apellido</label>
<%= text_field 'usuario', 'apellido' , {:class=>"text-input"} %>
</div>

<div class="form-element">
<label for="usuario_usuario">Usuario</label>
<%= text_field 'usuario', 'usuario' , {:class=>"text-input"} %>
</div>

<div class="form-element">
<label for="usuario_password">Password</label>
<%= password_field 'usuario', 'password' , {:class=>"text-input"} %>
</div>

<div class="form-element">
<label for="usuario_rol_id">Rol</label>
<%= select "usuario", "rol_id", @rols %>
</div>

<!--[eoform:usuario]-->

</div>
</fieldset>



Si nos fijamos lo único que agregamos fue esto:

<div class="form-element">
<label for="usuario_rol_id">Rol</label>
<%= select "usuario", "rol_id", @rols %>
</div>



Lo interesante de aqui es el select que llama al objeto usuario y en el campo rol_id se va a almacenar la seleccion que se escoja de la lista que se tiene en el objeto @rols.

Si corremos la aplicación nuevamente aparecerá el campo pero vacio, esto es porque aun el objeto @rols aun no tiene elementos para que esto suceda nos vamos a modificar el controlador a indicar que elementos tendrá el objeto @rols

Editamos el archivo usuarios_controller.rb

fvasquez@inf:~/sav$ nano app/controllers/usuario_controller.rb

Y dejamos la definición new como se muestra

def new
@usuario = Usuario.new
@rols = Rol.find_all.collect {|t|[t.rol, t.id] }
@successful = true

return render(:action => 'new.rjs') if request.xhr?

# Javascript disabled fallback
if @successful
@options = { :action => "create" }
render :partial => "new_edit", :layout => true
else
return_to_main
end
end


Lo que insertamos fue esto:

@rols = Rol.find_all.collect {|t|[t.rol, t.id] }

Esto quiere decir que el objeto @rols va a ser una colección de los elementos de un arreglo que regresa el método find_all.collect de la clase Rol los cuales son rol e id que se extraen de la tabla rols.

Estos son los elementos de visualización para nuestro campo select de captura, visualizaremos el elemento rol pero ingresaremos en nuestra tabla su id

Bien pues capturemos algunos elementos nuevos en la tabla usuarios a través de nuestra aplicación


http://localhost:3000/usuarios/


Pero que sucede si queremos editar algún registro... no podemos y esto es porque tanto la creación de nuevos registros como la edición utilizan los mismos principios así que en el mismo controller del usuario agregamos lo siguiente el la definición de edit


fvasquez@inf:~/sav$ nano app/controllers/usuario_controller.rb

def edit
begin
@usuario = Usuario.find(params[:id])
@successful = !@usuario.nil?
@rols = Rol.find_all.collect {|t|[t.rol, t.id] }
rescue
flash[:error], @successful = $!.to_s, false
end

return render(:action => 'edit.rjs') if request.xhr?

if @successful
@options = { :scaffold_id => params[:scaffold_id], :action => "update", :id => params[:id] }
render :partial => 'new_edit', :layout => true
else
return_to_main
end
end




Si nos damos cuenta solo ingresamos la misma linea que en el método new

@rols = Rol.find_all.collect {|t|[t.rol, t.id] }


Ahora vamos a ejecutar la aplicación y parecer ya esta funcionando el proceso de captura y edición de usuarios

http://localhost:3000/usuarios/


Pero no podemos ver en la tabla el campo rol_id....

Bien pues manos a la obra....

Lo que debemos hacer es indicar en nuestro modelo que campos son los que queremos ver de nuestra tabla y en el caso de rol_id evaluar mediante las relaciones que hicimos anteriormente que campo es el que queremos visualizar de la tabla rol, en vez del índice..


Para esto editamos el archivo usuario.rb y lo dejamos como se muestra a continuación

fvasquez@inf:~/sav$ nano app/models/usuario.rb

require 'ajax_scaffold'

class Usuario < ActiveRecord::Base
belongs_to :rol, :foreign_key => "rol_id"

@scaffold_columns = [
AjaxScaffold::ScaffoldColumn.new(self, { :name => "nombre"}),
AjaxScaffold::ScaffoldColumn.new(self, { :name => "apellido"}),
AjaxScaffold::ScaffoldColumn.new(self, { :name => "usuario"}),
AjaxScaffold::ScaffoldColumn.new(self, { :name => "password"}),
AjaxScaffold::ScaffoldColumn.new(self, { :name => "rol_id",
:eval => "usuario.rol.rol", :label => "Rol"}),
]
end


Con esto indicamos que en lugar de ponernos el numero correspondiente en el campo rol.id nos evalué y visualice el campo rol correspondiente de la tabla rols...

Y ahora a ver de nuevo la aplicación


http://localhost:3000/usuarios/


Bueno hasta aquí le vamos a dejar por ahora....
Pronto continuaremos utilizando Ruby on rails

Cualquier comentario es bien recibido.....

Faustino Vasquez Limon
Universidad Xochicalco Campus Tijuana
Linux User : "Agrega Espacio a tu disco Duro Quitando Windows"

 

Actualizado ( Miércoles, 05 de Marzo de 2008 12:41 )
 


LSC Support Online
SysOp
Tech Support
Encuestas
¿Cuál es tu navegador favorito?
 
Anunciate aquí

Centro de Soluciones Linux

KoalaSoft-Sitio de Amigos

ODM SYSTEM MEXICO

No. de Visitas
mod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_counter
mod_vvisit_counterHoy493
mod_vvisit_counterAyer636
mod_vvisit_counterEsta Semana2640
mod_vvisit_counterEste Mes9278
mod_vvisit_counterTotal76983
Linuxsc en RSS
Archivo Historico

Ultimo Reporte