Dos modelos en una sola forma de captura validada(Ruby on Rails)

0
472

Vamos a ver otro pequeño COMO acerca de la creacion de una sola forma para el llenado de dos tablas relacionadas y la validacion correspondiente de todos los campos de la misma…



Bien este proyecto lo he llamado ESCUELA y pondremos dos tablas de ejemplo ALUMNO y MATERIA

Cada tabla tiene dos campos:

ALUMNO ( nombre:string, apellido:string)
MATERIA ( nombre:string, maestro:string)

Manos a la obra Sonriente

Para nuestro proyecto vamos a utilizar el plugin resource_controller de James golick mas adelante utilizaremos algunas de sus ventajas.

Lo primero es crear el andamiaje para nuestro proyecto, recordemos que actualmente la base de datos default de rails es sqlite3 pero nosotros queremos manejar mysql asi que hacemos lo siguiente

fvasquez@fvasquez:~/ rails -d mysql escuela

Ahora tenemos que crear nuestra base de datos y la llamaremos igual que el proyecto escuela

fvasquez@fvasquez:~/ sudo mysqladmin create escuela

nos cambiamos al directorio de trabajo de nuestro proyecto y ahora lo que vamos a hacer es bajarnos el plugin scaffold resource desde el repositorio a traves de subversion…

fvasquez@fvasquez:~/ cd escuela

fvasquez@fvasquez:~/escuela$ svn export http://svn.jamesgolick.com/resource_controller/tags/stable vendor/plugins/resource_controller

Dentro del directorio vendor/plugins debemos tener ya nuestro plugin instalado…

Ahora vamos a corregir el archivo database.yml asi que lo editamos y lo dejamos como se muestra a continuacion

fvasquez@fvasquez:~/escuela$ 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: escuela
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
encoding: utf8
database: escuela
username: root
password:
socket: /var/run/mysqld/mysqld.sock

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

Ahora tenemos el enlace de nuestra aplicacion con la base de datos, vamos a construir las tablas para la aplicacion, para esto nos ayudaremos del plugin que acabamos de instalar y de su generador scaffold_resource que se llama igual a aquel que aparecio para la version 1.2.3… Ojo se llaman igual pero no son los mismos…

fvasquez@fvasquez:~/escuela$ ./script/generate scaffold_resource Alumno nombre:string apellido:string

fvasquez@fvasquez:~/escuela$ ./script/generate scaffold_resource Materia nombre:string maestro:string

Para este Ejercicio no vamos a modificar los archivos que se generan en /db/migrate por cuestiones de que no necesitamos hacer ningun ajuste…

Pues nos migramos los archivos creados hacia mysql

fvasquez@fvasquez:~/escuela$ rake db:migrate

Listo ya tenemos nuestro andamiaje completo con el CRUD para ambas tablas…

Ahora vamos a realizar los cambios que nos permitiran capturar las 2 tablas en una sola forma…

Como ambas tablas se van a unir en un solo formulario el cual va a ser el de usuarios tenemos que crear una relacion entre ambas, esta relacion se define en el modelo user y se va a indicar que el modelo virtual va a pertenecer esta

Aprovechamos y validamos en ambos modelos los campos que son requeridos en este caso todos, tambien definimos una validacion por asociacion desde alumno hasta materias…

Editamos:
fvasquez@fvasquez:~/escuela$ nano app/models/alumno.rb

class Alumno < ActiveRecord::Base
has_many :materias
validates_presence_of :nombre, :apellido, :message => “Campo Requerido”
end

fvasquez@fvasquez:~/escuela$ nano app/models/alumno.rb

class Materia < ActiveRecord::Base
belongs_to :alumnos
validates_presence_of :nombre, :maestro, :message => “Campo Requerido”
end

Como lo que queremos hacer es capurar dos modelos en una forma debemos modificar el archivo ” _form.html.erb “para que cualquier proceso de nuevo y editar se apliquen a los 4 campos, el archivo debe quedar como se muestra a continuacion..

fvasquez@fvasquez:~/escuela$ nano app/views/_form.html.erb

Nombre:
<%= f.text_field :nombre %>

Apellido:
<%= f.text_field :apellido %>

<% fields_for(:materia) do |f| %>

Nombre:
<%= f.text_field :nombre %>

Maestro:
<%= f.text_field :maestro %>

<% end %>

Ya teniendo la relacion entre los modelos, las validaciones y la vista vamos a nuestro controlador de Alumno que no tiene ningun metodo y vamos a crear los metodos new, create y lo dejamos como a continuacion se muestra..

fvasquez@fvasquez:~/escuela$ nano app/controllers/alumno_controller.rb

class AlumnosController < ResourceController::Base
def new
@alumno = Alumno.new
@materia = Materia.new
end

def create
@alumno = Alumno.new(params[:alumno])
@materia = @alumno.materias.build(params[:materia])
if @alumno.valid? && @materia.valid?
if @alumno.save
redirect_to :action => ‘index’
else
render :action => ‘new’
end
else
render :action => ‘new’
end
end
end

if @alumno.valid?… nos permite realizar la validacion de ambos modelos

ahora vamos a prender nuestro servidor y a probar la validacion campo por campo, intentalo y observa el resultado

fvasquez@fvasquez:~/NetBeans/escuela$ ./script/server

Veamos el navegador

Listado de alumnos

 

La forma de captura

 

Forma de Captura

 

Validacion de la forma queriendo grabar con un dato faltante

 

Validacion de la Forma

 

Esta opcion la puede probar con cada uno de los campos o con todos…

Espero les sirva este pequeño documentos… gracias 

 


Atte Faustino Vasquez Limon
Linux User…
“Agrega espacio a tu disco duro quitando windows”

LEAVE A REPLY

Please enter your comment!
Please enter your name here