Una de las grandes “features” de Rails es poder generar código, definiendo un modelo simple. En el curso decidimos implementar una lista de charlas, con oradores. Para Orador, definimos modelo Speaker y se generó código con:
La clave es la opción generate del comando rails. Con esa opción se pueden generar distintos archivos de texto, con scaffold genera los controladores, vistas, y modelos, con acceso a datos, de un modelo simple. El modelo se describe con Speaker name:string (se pueden poner más campos de distintos tipos).
Generó varios archivos, como app/models/speaker.rb:
class Speaker < ActiveRecord::Base
end
O el controlador app/controllers/speakers_controller.rb:
class SpeakersController < ApplicationController
# GET /speakers
# GET /speakers.json
def index
@speakers = Speaker.allrespond_to do |format|format.html # index.html.erbformat.json { render json: @speakers }
end
end
# GET /speakers/1
# GET /speakers/1.json
def show
@speaker = Speaker.find(params[:id])respond_to do |format|format.html # show.html.erbformat.json { render json: @speaker }
end
end
# GET /speakers/new
# GET /speakers/new.json
def new
@speaker = Speaker.newrespond_to do |format|format.html # new.html.erbformat.json { render json: @speaker }
end
end
# GET /speakers/1/edit
def edit
@speaker = Speaker.find(params[:id])end
# POST /speakers
# POST /speakers.json
def create
@speaker = Speaker.new(params[:speaker])respond_to do |format|if @speaker.save
format.html { redirect_to @speaker, notice: 'Speaker was successfully created.' }
format.json { render json: @speaker, status: :created, location: @speaker }
else
format.html { render action: "new" }format.json { render json: @speaker.errors, status: :unprocessable_entity }
end
end
end
# PUT /speakers/1
# PUT /speakers/1.json
def update
@speaker = Speaker.find(params[:id])respond_to do |format|if @speaker.update_attributes(params[:speaker])
format.html { redirect_to @speaker, notice: 'Speaker was successfully updated.' }
format.json { head :ok }
else
format.html { render action: "edit" }format.json { render json: @speaker.errors, status: :unprocessable_entity }
end
end
end
# DELETE /speakers/1
# DELETE /speakers/1.json
def destroy
@speaker = Speaker.find(params[:id])@speaker.destroyrespond_to do |format|format.html { redirect_to speakers_url }
format.json { head :ok }
end
end
end
Y distintas vistas en app/views/speakers como index.html.erb:
<h1>Listing speakers</h1><table><tr><th>Name</th><th></th><th></th><th></th></tr><% @speakers.each do |speaker| %><tr><td><%= speaker.name %></td><td><%= link_to 'Show', speaker %></td><td><%= link_to 'Edit', edit_speaker_path(speaker) %></td><td><%= link_to 'Destroy', speaker, confirm: 'Are you sure?', method: :delete %></td></tr><% end %></table><br /><%= link_to 'New Speaker', new_speaker_path %>Luego, levantamos el servidor de nuevo con:
rails server
Levanta el servidor como antes, pero si navegamos a http://localhost:3000/speakers
![]()
Resulta que se generó código para soportar una lista de oradores, y una tabla de oradores en la base de datos, pero esta última todavía está vacía, sin la tabla correspondiente. El generador de código de Rails se encargó de dejar también los comandos de actualización de la base. Ejecutamos:
![]()
Vean que crea la tabla de Speakers (ver el directorio db/migrate donde quedó un archivo que define el paso 20111218214020_create_speakers.rb:
class CreateSpeakers < ActiveRecord::Migration
def change
create_table :speakers do |t|
t.string :namet.timestampsend
end
end
Noten que el nombre del archivo tiene la fecha/hora de creación, para luego reproducir en orden los comandos contra la base de datos para que ésta quede actualizada. Ahora, navegamos de nuevo a http://localhost:3000/speakers:
![]()
Puedo dar de alta un orador:
![]()
Y el resultado es:
![]()
Bien! Ya tenemos nuestro primer modelo simple, y las páginas (noten las URLs que se formaron) para manejarlo.
Próximos temas: extendiendo el modelo, relaciones uno a varios, desplegando en Heroku.
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com