Ubigeo Rails

¿Qué es Ubigeo?

Bueno, en cierto país donde nací(Perú), el ubigeo es un número de identificación que identifica a un departamento, provincia o distrito del país, algo así:

  • Departamento de Lima: 15
  • Provincia de Lima: 1501
  • Distrito de Lima: 150101

Esta gema es una abstracción de dos acciones relacionadas a este concepto, que son:

  1. Endpoints de json que nos dan las provincias de una departamento.
  2. Una librería de Javascript que abstrae la idea de selectores dependientes que es el widget más usado para ingresar información de ubigeo en internet.

Asunciones

  • Usas Formtastic (posiblemente a futuro se haga algo para SimpleForm o alguna opción más agnóstica como un helper que funcione como un widget)

Uso

Instalación

Agrega la gema al Gemfile

gem 'ubigeo_rails'

Luego, instala la gema, lo que creará una ruta y un inicializador.

rails g ubigeo_rails:install

Agrega la siguiente librería a tu manifiesto (app/assets/application.js):

//= require ubigeo

Llena el Ubigeo

Si ya tienes una tabla de Ubigeo

Edita el inicializador (en app/config/initializers/ubigeo_rails.rb) con datos como los siguientes:

UbigeoRails.config do |config|
  config.table_name 'ubigeo_ubigeo'
  config.db_connection { "general_#{Rails.env}" }
end

La razón principal de estas opciones es para poder conectar a bases de datos ya existentes.

Si no la tienes

Si no tienes una bd ya existente, puedes llenar la base de datos de ubigeo en dos pasos:

Crear la tabla:

rails g migration create_ubigeos name:string parent_id:integer
rake db:migrate 

Generar los seeds (la información):

rails g ubigeo_rails:seeds

El primero creará una migración y el segundo agregará código al archivo seeds.rb que permitirá generar la data usando el estándar:

rake db:seed

Crea una relación

Para asociar el modelo de Ubigeo a otro, debes especificar la clase exacta de Ubigeo, que es UbigeoRails::Ubigeo. Por ejemplo, si queremos asociarla a un usuario:

class User << ActiveRecord::Base
  belongs_to :ubigeo, class_name: "UbigeoRails::Ubigeo"
end

Úsala en un formulario

Puedes usarlo el plugin como cualquier input de Formtastic. Sólo debes colocar el valor :ubigeo en la opción :as:

# Imaginemos un formulario para un usario
= semantic_form_for @user do |f|
  = f.input :ubigeo_id, as: :ubigeo, prompt: ["selecciona un departamento", "selecciona una provincia", "selecciona un distrito"]

La única opción por el momento es prompt, que te permitirá elegir los 3 elementos vacíos que puede haber sobre cada uno de los 3 selects que conforman el plugin. De no necesitar este prompt, simplemente no lo colocamos.

Extras

La Ruta

Por defecto, la engine (esto es una rails engine) será montada en /ubigeo. Puedes revisar el código generado en config/routes.rb para cambiar el punto de montaje.

El Modelo

También puedes usar los siguientes métodos de la clase Ubigeo:

  • #has_department?: Si el código de ubigeo contiene o no la información de un departamento
  • #has_province?: Si el código de ubigeo contiene o no la información de una provincia
  • #has_district?: Si el código de ubigeo contiene o no la información de un distrito
  • .with_parent(id): Devuelve los hijos de un ubigeo. Por ejemplo, los distritos de Lima o las provincias de Arequipa.