
Friendly URL
Una URL Amistosa o friendly url (en inglés), es una dirección que en lugar de tener números y cientos de símbolos raros contenga un titulo o un tag, o sea en lugar de:
http://www.desafiolatam.com/blog/20/
obtienes:
http://www.desafiolatam.com/blog/articulo-genial-sobre-programacion/
y por qué esto es importante?
primero, para los humanos es más fácil leer y entender en que página están y lo que están viendo, o sea es human friendly, pero por otro lado, google (u otros indexadores) l utilizan el título de la página para determinar las palabras claves del sitio para calcular la relevancia, entonces al tener una url friendly mejoras el SEO de tu sitio, a esto se le denomina que el sitio sea SEO friendly.
Crear una friendly url en Ruby on Rails en 5 pasos
En este tutorial (repo en github) te explico como Crear una friendly url en Ruby on Rails en 5 pasos a partir de un “slug” para tu aplicación en rails.
El concepto de Slug es un término que hace referencia al título de una noticia o artículo en el que se han sustituido los espacios en blanco por guiones y se han eliminado todos los caracteres que no sean letras o números.
Ahora que sabemos que es el slug, vamos al paso a paso para generar slug automáticamente para nuestros posts.
Ejemplo:
título de la noticia: ¿Cómo crear un Slug en Rais?
Slug: como-crear-un-slug-en-rails
1. Creando el Proyecto Blog.
Abres una Terminal y escribes:
$> rails new blog
Acceder a la carpeta “blog” desde el terminal:
$> cd blog
$> rails s
2. Creando el Scaffold: Post.
$> rails g scaffold post title:string description:text
Antes de este paso revisa siempre tu migración!. Luego ejecutamos en el terminal:
$> rake db:migrate
Cambiando el archivo Routes.rb
busca donde dice:
# root 'welcome#index'
Quita el signo # para descomentar y cámbialo por:
root 'posts#index'
3. Agregando una nueva columna “slug” a la tabla posts.
Como no queremos que el campo “slug” aparezca por pantalla ni tampoco como strong parameter, generamos una nueva migración al modelo de post:
$> rails g migration addSlugToPost slug:string
Ejecutamos en otra terminal:
$> rake db:migrate
el resultado debe ser el siguiente:
4. Modificando el Modelo de Post (app/models/post.rb)
4.1. Definiendo Callbacks.
#callbacks after_create :update_slug before_update :assign_slug
el primer callback es “after_create” el cual tendrá asociado un método llamado “update_slug” el cual se llama inmediatamente “después de crear” un nuevo post.
el segundo callback es “before_update” el cual se llama “antes de actualizar” cualquier atributo del modelo post.
4.2. Reemplazando el método to_param.
#redefinimos el metodo to_param def to_param slug end
Lo que acabamos de hacer es un “override” del método to_param en nuestro modelo post, con el objetivo de que post_path contruya una ruta usando la columna “slug” de un post en lugar de su id. esto lo usaremos más adelante en el controller posts_controller.rb
4.3. Creando Metodos privados para manejar el valor del slug.
#metodos privados. private def assign_slug self.slug = "#{ title.parameterize }" end def update_slug update_attributes slug: assign_slug end
El primer método “assign_slug” lo que hace es asignar un valor a slug, el cual será el “title” del post con un formato trabajado de manera que se reemplacen los caracteres especiales y se agreguen guiones entre espacios vacíos. este trabajo lo se lo dejaremos al método .parameterize.
Luego viene el siguiente método “update_slug”, el cual se gatilla con el callback “after_create” (que definimos al principio del modelo) es decir, inmediatamente después de crear un post, se actualizará el atributo “slug” con el valor que retorne el método assign_slug.
5. Último paso: Modificando el posts_controller.rb
Ahora que agregamos lo necesario en el modelo, vamos a intervenir el controller, abre app/controllers/posts_controller.rb y revisa el metodo set_post (se ubica al final del archivo)
def set_post @post = Post.find(params[:id]) end
Reemplázalo por esto:
def set_post @post = Post.find_by_slug(params[:id]) end
Hay un método que Rails nos provee que son los “find_by_algunAtributo” este tipo de métodos son convenientes para buscar registros a partir del valor de un atributo, estos métodos se denominan “dynamic finders” .
Observación: es importante que en el modelo esté el override de to_param bien definido para que params[:id] entienda que buscamos por columna slug y no por id.
y el Bonus track!
Podemos “ocultar” el controller de la url haciendo un truco muy sencillo en el archivo routes.rb de modo que:
http://www.example.com/posts/como-crear-un-slug-en-rails
se transforme a esto:
http://www.example.com/como-crear-un-slug-en-rails
Para ocultar el controller en la url tenemos que hacer lo siguiente, donde dice:
resources :posts
cambia por esto:
resources :posts, :path => ''
Ahora solo nos queda probar nuestra aplicación de Posts con url amistosas!
KEEP CODING! 😀

- 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