La idea detrás de la metodología MVC (Modelo Vista Controlador) consiste en separar en 3 capas independientes, pero interconectadas entre sí aspectos comunes a cualquier aplicación web.
De este modo tenemos las siguientes capas:
- Modelo:Se encarga de encapsular la entidad que queremos representar y persistirla en memoria de alguna manera (habitualmente una base de datos).
- Vista:Se encarga de proporcionar al usuario una interfaz para visualizar e introducir información.
- Controlador:Contiene la lógica que se usará para administrar la información que circulará por el sistema. Es decir, se encargará de realizar las operaciones necesarias para proporcionar información de salida o se encagará de administrar la información que el usuario haya introducido.
La idea detrás de esto es mantener estos tres aspectos de cualquier aplicación independientes entre sí, de manera que un diseñador web pueda trabajar en la interfaz de nuestra aplicación mientras que un equipo de programadores desarrollan la lógica y tal vez un administrador de bases de datos define la mejor manera de almacenar nuestros objetos.
Hasta aquí a teoría, vayamos a la práctica. (Este ejemplo supone que tienes Ruby y Rails instalados)
Rails incorpora esta metodología como parte de su diseño, de manera que trabajando con Rails automáticamente estamos usando MVC.
Comencemos creando un nuevo proyecto de Rails. Abrimos una terminal nueva e introducimos:
rails bookstore
Esto nos generará el esqueleto de una aplicación Rails lista para trabajar.
Ahora para generar nuestros componentes basta con entrar al nuevo directorio que Rails ha creado:
cd bookstore
y escribir el siguiente comando:
./script/generate model book
o
ruby script/generate model book
Según la plataforma que uses y rails se encargará de crear varios archivos:
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/book.rb
create test/unit/book_test.rb
create test/fixtures/books.yml
create db/migrate
create db/migrate/20081103140957_create_books.rb
En concreto nos interesan los dos archivos resaltados: book.rb y 20081103140957_create_books.rb
Si abrimos con cualquier editor book.rb veremos algo así:
class Book < ActiveRecord::Base
end
Esta aparentemente inofensiva clase incorpora un montón de funciones encapsuladas dentro de ActiveRecord::Base que importa todas las funciones de la clase ActiveRecord.
Dentro de esta clase incorporaremos todas las restricciones y lógica aplicada al modelo, de manera que podemos diseñar independientemente nuestro modelo.
El otro archivo que nos interesa 20081103140957_create_books.rb veremos algo así:
class CreateBooks < ActiveRecord::Migration
def self.up
create_table :books do |t|
t.timestamps
end
end
def self.down
drop_table :books
end
end
Donde podemos definir las columnas que formarán parte del objeto que persistiremos en nuestra base de datos. Ej:
create_table :books do |t|
t.column :title, :string
t.column :ISBN, :string
t.column :author, :string
t.timestamps
end
Con esto tenemos nuestros modelos perfectamente controlados y listos para trabajar.
Ahora, si queremos generar un controlador basta con introducir el siguiente comando en nuestra terminal:
./script/generate controller bookstore
Lo cual al igual que antes, nos generará algunos archivos:
exists app/controllers/
exists app/helpers/
create app/views/bookstore
exists test/functional/
create app/controllers/bookstore_controller.rb
create test/functional/bookstore_controller_test.rb
create app/helpers/bookstore_helper.rb
Como antes el archivo que nos interesa es el llamado bookstore_controller.rb
class BookstoreController < ApplicationController
end
Al igual que antes vemos que esta clase, aparentemente vacía hereda de ApplicationController, lo cual nos permite hace bastantes cosas, entre ellas definir código que va a controlar las vistas que vamos a generar.
Por ejemplo podemos escribir algo como:
class BookstoreController < ApplicationController
def index
#Codigo para la página bookstore/index.html.erb
end
def add
#Codigo para la pagina bookstore/add.html.erb
end
def remove
#Codigo para la pagina bookstore/remove.html.erb
end
end
Como podéis ver, los métodos que definimos dentro del controlador tienen efecto sobre ciertas páginas. La idea que hay tras ruby on rails es que este framework se encarga de realizar “todo el cableado interno” entre el controlador y las vistas.
Si nos fijamos en la estructuras de carpetas que nos generó el comando rails vemos que existe la siguiente estructura:
app/view/bookstore
Como vemos Rails nos genera una carpeta para almacenar las vistas asociadas al controlador que hemos creado (bookstore), de manera que podemos crear los archivos que serán nuestras vistas dentro de cada carpeta asociada a un controlador. Ej: index.hml.erb
<p> Hola, esta es la vista para la acción Index </p>
Importante, el nombre de la página debe llamarse igual que el nombre de la acción en el controlador.
Ej. Para el método index, debe existir el archivo index.html.erb, para el método add debe existir el archivo add.html.erb y así sucesivamente.
Si os habéis perdido en estos pasos lo mejor que podéis hacer es jugar un poco con vuestra aplicación de Rails.
Para ello arrancad vuestra aplicación con el siguiente comando:
./script/server
E introducid la siguiente dirección en vuestro browser:
http://localhost:3000/bookstore/index
Si todo ha ido bien debierais ver el texto:
Hola, esta es la vista para la acción Index
Como podemos ver las rutas en rails son bastante simples de entender:
Host/Controller/Action
Listo, ya tenéis una pequeña aplicación usando la metodología MVC. Cierto que no hace gran cosa, pero es un buen punto de partida :)