Problemas técnicos 1/8: URL’s Amigables

Alex Romo
Idearia Lab
Published in
2 min readJun 28, 2017

Friendly Id en Ruby on Rails

Alejandro Escamilla — Unsplash.com

¿A qué me refiero con hacer urls amigables?
Cuando trabajas con Ruby on Rails lo más común es que te encuentres que tus urls parecen algo así:

www.ejemplo.com/pais/46546
Lo que hace la siguiente gema es utilizar datos que proporcionas en tus formularios para crear urls como esta:
www.ejemplo.com/pais/México

¿Cuál es la diferencia?

Es más fácil ubicar dónde te encuentras, qué estás viendo en este momento y hacia donde puedes moverte.

¿Cómo utilizar la gema Friendly Id?

Supongamos que quieres incluir friendly id a tu modelo de Countries para que en el url aparezca el nombre del país y no el ID.

1- Instalar gema en Gemfile

gem 'friendly_id', '~> 5.1.0'

2- Correr la instalación en la terminal:

rails generate friendly_id

3.- Si no has generado el modelo Countries, incluye un nuevo campo en tu nuevo modelo que tenga el nombre de slug:string:uniq, ahí guardará el texto que aparecerá en el url y tendrá que ser único para que no haya problemas si se llega a repetir el nombre, es decir:

rails generate model Country name:string slug:string:uniq

Si ya habías generado el modelo antes, lo que tienes que hacer es una migración para incluir un nuevo campo, así:

rails generate migration AddSlugToCountry slug:string:uniq

Corres la migración de la base de datos:

$ rake db:migrate

Lo último que tienes que hacer es ir al modelo que está utilizando, en este caso el modelo Countries(app/models/country.rb), e incluir friendly Id, de esta manera:

class Country < ApplicationRecord
extend FriendlyId
friendly_id :name, use: :slugged
end

Lo que quiere decir el código es que va a utilizar la gema de Friendly Id y utilizará la información del campo “name” para el nuevo URL.

Si ya tenías algunos registros hechos y quieres modificar sólo el url, corres este código en la consola de Rails. Buscará todos los registros y los volverá a guardar.

rails consoleCountry.find_each(&:save)

--

--