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
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
La forma de captura
Validacion de la forma queriendo grabar con un dato faltante
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”