Skip to content

Commit

Permalink
Added slugs to ease creation of friendly IDs
Browse files Browse the repository at this point in the history
  • Loading branch information
javiertoledo committed Dec 12, 2013
1 parent 8dc9834 commit 33caf21
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 13 deletions.
17 changes: 10 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,20 +20,22 @@ O instálala ejecutando el siguiente comando:

## Usage

La interfaz es similar a la de ActiveRecord, salvando las distancias. La gema provee con códigos numéricos de provincias y ciudades que puedes usar para enlazarlas con tus modelos.
La interfaz es similar a la de ActiveRecord, salvando las distancias. La gema provee códigos numéricos e identificadores de tipo string llamados slugs (Cuyo funcionamiento emula al de la gema friendlyId) y que puedes usar para enlazarlas con tus modelos. Es posible buscar tanto provincias como ciudades usando indiferentemente IDs o slugs. Los slugs se generan a partir de los nombres pasando todos los caracteres a minúscula, eliminando símbolos y caracteres no alfanuméricos y separando cada palabra con un guión. Por ejemplo: `"Iruña Oka/Iruña de Oca"` => `"iruna-oka-iruna-de-oca"`

Gestión de provincias:

Provincias.find(28) => #<Provincia: @id=28, @name="Madrid">
Provincias.find_by_name('Palmas, Las') => #<Provincia: @id=35, @name="Palmas, Las">
Provincias.find(28) => #<Provincia: @id=28, @name="Madrid", @slug="madrid">
Provincias.find("madrid") => #<Provincia: @id=28, @name="Madrid", @slug="madrid">
Provincias.find_by_name('Palmas, Las') => #<Provincia: @id=35, @name="Palmas, Las", @slug="palmas-las">
Provincias.find_by_name('wombat') => nil
Provincias.all => [...] # Un array de provincias
Provincias.all_for_select => [...] # Un array de la forma [name, id] para usarlo en los helpers de tipo select en Rails

Gestión de ciudades de forma absoluta:

Provincias::Ciudades.find(35017) => #<Ciudad: @id=35017, @name="Puerto del Rosario" ...>
Provincias::Ciudades.find_by_name("Puerto del Rosario") => #<Ciudad: @id=35017, @name="Puerto del Rosario" ...>
Provincias::Ciudades.find(35017) => #<Ciudad: @id=35017, @name="Puerto del Rosario", @slug="puerto-del-rosario"...>
Provincias::Ciudades.find("puerto-del-rosario") => #<Ciudad: @id=35017, @name="Puerto del Rosario", @slug="puerto-del-rosario"...>
Provincias::Ciudades.find_by_name("Puerto del Rosario") => #<Ciudad: @id=35017, @name="Puerto del Rosario", @slug="puerto-del-rosario" ...>
Provincias::Ciudades.all => [...] # Un array de ciudades
Provincias::Ciudades.all_for_select => [...] # Un array de la forma [name, id] para usarlo en los helpers de tipo select en Rails
Provincias::Ciudades.find_by_name("Puerto del Rosario").provincia => #<Provincia: @id=35, @name="Palmas, Las">
Expand All @@ -42,7 +44,8 @@ Gestión de ciudades de forma relativa a una provincia (Esta es la parte que no

Provincias.find(28).ciudades => [...] # Un array con las ciudades de la provincia de Madrid
Provincias.find(28).ciudades_for_select => [...] # Un array con las ciudades de la provincia de Madrid de la forma [name, id] para usarlo en los helpers de tipo select en Rails
Provincias.find(28).find_ciudad(28006) => #<Ciudad: @id=28006, @name="Alcobendas" ...>
Provincias.find(28).find_ciudad_by_name("Alcobendas") => #<Ciudad: @id=28006, @name="Alcobendas" ...>
Provincias.find(28).find_ciudad(28006) => #<Ciudad: @id=28006, @name="Alcobendas", @slug="alcobendas" ...>
Provincias.find(28).find_ciudad("alcobendas") => #<Ciudad: @id=28006, @name="Alcobendas", @slug="alcobendas" ...>
Provincias.find(28).find_ciudad_by_name("Alcobendas") => #<Ciudad: @id=28006, @name="Alcobendas", @slug="alcobendas" ...>

Todas las búsquedas retornan nil si no encuentran coincidencias con lo que estás buscando.
25 changes: 20 additions & 5 deletions lib/provincias.rb
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
# -*- encoding: utf-8 -*-
require "provincias/version"
require 'csv'
require 'i18n'

module Provincias

def self.find(id)
@@provincias[id]
@@provincias[id] || self.find_by_slug(id)
end

def self.find_by_slug(slug)
@@provincias.values.select { |p| p.slug == slug }.first
end

def self.find_by_name(name)
Expand All @@ -21,9 +26,10 @@ def self.all_for_select
end

class Provincia
attr_reader :id, :name
attr_reader :id, :name, :slug
def initialize(row)
id, @name = row
@slug = I18n.transliterate(@name).downcase.scan(/\w+/).join('-')
@id = id.to_i
end

Expand All @@ -36,7 +42,11 @@ def ciudades_for_select
end

def find_ciudad(id)
ciudades.select { |c| c.id == id }.first
ciudades.select { |c| c.id == id }.first || self.find_ciudad_by_slug(id)
end

def find_ciudad_by_slug(slug)
ciudades.select { |c| c.slug == slug }.first
end

def find_ciudad_by_name(name)
Expand All @@ -55,7 +65,11 @@ def self.load_data
module Ciudades

def self.find(id)
@@ciudades[id]
@@ciudades[id] || self.find_by_slug(id)
end

def self.find_by_slug(slug)
@@ciudades.values.select { |c| c.slug == slug }.first
end

def self.find_by_name(name)
Expand All @@ -75,9 +89,10 @@ def self.all_for_select
end

class Ciudad
attr_reader :provincia_id, :id, :dc, :name
attr_reader :provincia_id, :id, :dc, :name, :slug
def initialize(row)
provincia_id, number, @dc, @name = row
@slug = I18n.transliterate(@name).downcase.scan(/\w+/).join('-')
@provincia_id = provincia_id.to_i
@id = (provincia_id+number).to_i
end
Expand Down
2 changes: 1 addition & 1 deletion lib/provincias/version.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# -*- encoding: utf-8 -*-
module Provincias
VERSION = "0.0.4"
VERSION = "0.1.0"
end
11 changes: 11 additions & 0 deletions test/test_api.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,12 @@ def test_provincias
assert_nil Provincias.find(100000)
assert_equal Provincias.find(28).id, 28
assert_equal Provincias.find(28).name, "Madrid"
assert_equal Provincias.find(28).slug, "madrid"
assert_equal Provincias.find('madrid').name, "Madrid"
assert_equal Provincias.find('palmas-las').name, "Palmas, Las"
assert_equal Provincias.find_by_name('Palmas, Las').id, 35
assert_equal Provincias.find_by_name('Palmas, Las').name, 'Palmas, Las'
assert_equal Provincias.find_by_name('Palmas, Las').slug, 'palmas-las'
assert_nil Provincias.find_by_name('wombat')
assert_instance_of Array, Provincias.all
assert_instance_of Provincias::Provincia, Provincias.all.first
Expand All @@ -27,18 +31,25 @@ def test_ciudades
assert_not_nil Provincias::Ciudades.find(35017)
assert_equal Provincias::Ciudades.find(35017).id, 35017
assert_equal Provincias::Ciudades.find(35017).name, 'Puerto del Rosario'
assert_equal Provincias::Ciudades.find(35017).slug, 'puerto-del-rosario'
assert_equal Provincias::Ciudades.find('puerto-del-rosario').id, 35017
assert_equal Provincias::Ciudades.find('puerto-del-rosario').name, 'Puerto del Rosario'
assert_equal Provincias::Ciudades.find('puerto-del-rosario').slug, 'puerto-del-rosario'
assert_nil Provincias::Ciudades.find_by_name('wombat')
assert_instance_of Provincias::Ciudades::Ciudad, Provincias::Ciudades.find_by_name('Palmas de Gran Canaria, Las')
assert_equal Provincias::Ciudades.find_by_name('Palmas de Gran Canaria, Las').id, 35016
assert_equal Provincias::Ciudades.find_by_name('Palmas de Gran Canaria, Las').name, 'Palmas de Gran Canaria, Las'
assert_equal Provincias::Ciudades.find_by_name('Palmas de Gran Canaria, Las').slug, 'palmas-de-gran-canaria-las'
assert_instance_of Array, Provincias.find(28).ciudades
assert_instance_of Provincias::Ciudades::Ciudad, Provincias.find(28).ciudades.first
assert Provincias.find(28).ciudades.map { |c| c.name }.include?("Madrid")
assert !Provincias.find(35).ciudades.map { |c| c.name }.include?("Madrid")
assert_nil Provincias.find(28).find_ciudad(999999999)
assert_instance_of Provincias::Ciudades::Ciudad, Provincias.find(28).find_ciudad(28001)
assert_equal "Acebeda, La", Provincias.find(28).find_ciudad(28001).name
assert_equal "Acebeda, La", Provincias.find(28).find_ciudad("acebeda-la").name
assert_equal 28001, Provincias.find(28).find_ciudad(28001).id
assert_equal 28001, Provincias.find(28).find_ciudad("acebeda-la").id
assert_instance_of Provincias::Ciudades::Ciudad, Provincias.find(28).find_ciudad_by_name("Alcobendas")
assert_nil Provincias.find(28).find_ciudad_by_name("wombat")
assert_equal "Alcobendas", Provincias.find(28).find_ciudad_by_name("Alcobendas").name
Expand Down

0 comments on commit 33caf21

Please sign in to comment.