
Hola Rubystas! para poner en práctica lo aprendido, lo mejor es crear proyectos experimentales para jugar. Aquí les presento una aplicación llamada streetmusicMap, está en su fase inicial, prototipo que comencé este fin de semana, y el cual estoy construyendo junto con mi partner de Software y creadora del blog ConciertosComentados: Melissa.
Para desarrollar esta app, comenzaré con la creación de 2 Scaffolds: Musician e Instrument. y los uniremos en el modelo a través de una relación “uno a muchos”, en donde visualmente nos ayudará un Combobox. En la Segunda Parte mostraré como esa data la integramos a un Google Map, usando la gema gmaps4Rails.
Creando la App.
Abres un Terminal y escribes:
$ rails new mapa
Acceder al proyecto desde el terminal:
$ cd mapa
Creando el Scaffold: Musician.
$ rails generate scaffold Musician latitude:float longitude:float youtube_video:string twitter:string facebook:string address:string description:string musician_name:string instrument_id:integer
(*el campo instrument_id:integer es una clave foranea del scaffold Instrument que realizaremos a continuación. y el campo latitude:float longitude:float los usaremos mas adelante en la parte 2 del streetMusicmap cuanodo integremos la gem gmaps4rails)
Ejecutamos en el terminal:
$ rake db:migrate
Creando el Scaffold: Instrument.
$ rails generate scaffold Instrument instrument_name:string
Ejecutamos en el terminal:
$ rake db:migrate
Ok, ahora tenemos 2 CRUD, Musician e Instrument (usen conceptos en inglés para crear scaffolds)
Agregar Instrumentos es simple, ya que es sólo un nombre. La parte que nos interesa es cuando agregamos un Músico, y tenemos que categorizarlo mediante un combobox cargado con instrumentos.
Modelo: Creando la relación Uno a Muchos.
Accedemos al archivo routes a través de mapa/config/routes.rb y cambiamos “welcome#index” por:
root 'musicians#index'
Al acceder por browser a nuestra vista de músicos http://locahost:3000/musicians los datos se muestran de esta manera: Nombre del Musico / ID del instrumento…pero lo que queremos ver por pantalla es el nombre del instrumento no su ID! Para lograr este proposito es que creamos la relación “uno a muchos” en el modelo:
En app/models/musician.rb escribe:
class Musician < ActiveRecord::Base belongs_to :instrument end
Y en app/models/instrument.rb escribes:
class Instrument < ActiveRecord::Base has_many :musicians end
la relación entre Músico e Instrumento en nuestro ejercicio específicamente se lee así:
“un Músico pertenece_a una categoría” (belongs_to)
y “Una categoría tiene_muchos Musicos”. (has_many)
La Vista: Cambiando instrument_id.
en app/views/ musicians/ index.html.erb buscas:
<%= musician.instrument_id %>
y lo reemplazas por:
<%= musician.instrument.instrument_name %>
Refrescas el browser y verás por pantalla ahora el Nombre del instrumento en lugar de su ID..mucho mejor!
El Controller: Modificando el método new
Al mostrar la view /musicians/new tenemos que agregar un nuevo objeto @instruments, el cual recibirá todos los registros que el Modelo le devuelva y esos datos lo vamos a cargar en un combobox.
En app/controllers/musicians_controller.rb busca:
def new @musician = Musician.new end
y lo reemplazas por:
def new @musician = Musician.new @instruments = Instrument.all end
Ahora en la vista parcial app/views/musicians/_form.html.erb busca:
<%= f.number_field :instrument_id %>
y reemplázalo por este helper: (ésta línea dibuja el combobox de instrumentos por pantalla)
<%= collection_select(:musician, :instrument_id, @instruments, :id, :instrument_name, prompt: true) %>
Desde tu navegador ingresa a:
http://localhost:3000/musician/new
Excelente! 🙂 Ahora vemos un Combobox para categorizar a nuestros musicos. Más info sobre este Helper collection_select aquí!
Seguramente si accedes a la view “edit” verás un error, eso es porque tenemos que agregar un objeto @instruments en el método “edit” del controller musician ya que también al editar un registro de músico, necesitamos ver el combobox cargado pero posicionando en primer item el instrumento que le pertenece a este músico.
En app/controllers/musicians_controller.rb busca:
def edit end
y lo reemplazas por:
def edit @musician = Musician.find(params[:id]) @instruments = Instrument.all end
Ya estamos casi terminando nuestra primera parte de la aplicación, sólo un detalle más…
En app/views/musicians/show.html.erb busca:
<%= @musician.instrument_id %>
y lo reemplazas por:
<%= @musician.instrument.instrument_name %>
Y ya tienes una aplicación uniendo 2 scaffolds y cargando un combobox en la Vista.
pd: Se viene luego la parte 2: Ahora te recomiendo ir por una buena taza de café y luego revisa el tutorial parte 2: Integración con google maps y la gema Gmaps4Rails.

- Friendly URL en Rails - March 8, 2015
- Borrar un Scaffold en Ruby on Rails - January 24, 2015
- “My Concerts Wishlist” ajax scaffold Ruby on Rails - January 1, 2015
- StreetmusicMap parte 2: Integración Gmaps4Rails - December 12, 2014
- StreetmusicMap parte 1: Combobox uno a muchos en Ruby on Rails - December 11, 2014
- Twitter Search API + Ruby on Rails (II parte) - September 24, 2014
- Twitter Search API + Ruby on Rails - September 24, 2014
- SSL error: Certificate Verify Failed - September 18, 2014
Leave a Reply