Mi Día en el Ruby Fun Day (7) Primer Modelo

Anterior Post

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.all
    respond_to do |format|
      format.html # index.html.erb
      format.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.erb
      format.json { render json: @speaker }
    end
  end
  # GET /speakers/new
  # GET /speakers/new.json
  def new
    @speaker = Speaker.new
    respond_to do |format|
      format.html # new.html.erb
      format.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.destroy
    respond_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 :name
      
      t.timestamps
    end
  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
http://twitter.com/ajlopez

This entry was posted in 10747, 16397, 16509, 3463. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>