El SysAdmin del 3er Mundo

todo lo que expliqué mientras nadie prestaba atención

date_select en español

| Comments

Algunos componentes de Ruby on Rails, se pueden usar de manera independiente, como es el caso de active_record (sin dudas es el más potente). Pero otro que no se queda atrás, es active_support. Lleno de sorpresas y de joyas poco documentadas.

Para el que no lo conozca, en ruby on rails, hay un método muy cómodo que genera un select cuyas option son nada menos que la fecha. Los usuarios mononeuronales, encuentran más cómodo introducir una fecha así, que con un datepicker.

El método select_date genera una cosa similar a esta:

Pero con todos los meses y sus días claro. Ahí soló te puse un pedazito. Para generar esto, se supone que solo necesites poner algo como:

“select_date”
1
<%= select_date Date.today, prefix: :caudocidad %>

Luego en el controlador, generas la fecha, procesando el dato. Hay mil y una forma de hacerlo. Más mágica y menos mágica, yo lo hago de una manera bien rudimentaria:

“Time.mktime en el controller”
1
@cuando=Time.mktime params[:caudocidad][:year],params[:caudocidad][:month],params[:caudocidad][:day]

Como vez, a prefix: se le mandó un símbolo, que pasó a ser el valor del HTML generado, name=“caudocidad”. En mi caso, se llama “cadocidad” usted le pone como le de la gana. Sería :prefix=>‘nombre_que_quieras’ o prefix: ‘nombre’ en su versión corta.

En el controlador, params[:caudocidad], contiene un Hash, donde las claves :year, :month y :day tendrán los valores numéricos listos para ser procesados.

params[:caudocidad]
1
{:year=>2015, :month=>8, :day=>12}

Todo eso está muy bonito, pero lo jodido del caso, es que los meses vienen en inglés.

Llevarlo a español, requiere estar un poco familiarizado con el i18n de Ruby on rails.

Para el que no lo conozca, el i18n, es un sistema que nos permite crear aplicaciones en múltiples idiomas. De forma tal que nuestra aplicación le hable al navegador en el idioma que este soporta. Lo malo del caso es que no lo hace solo. Serás tu quien deba indicarle cuando usar que idioma. Una buena manera de hacer eso, es parseando el encabezado “content-” para ver que idioma soporta el navegador. Métodos hay miles, pero no se porque rails no lo hace solo.

Si nuestra aplicación fuera canadiense, le diría que cree un fichero para cada idioma. Pero como nuestra aplicación es Cubana, con ponerlo todo en el en.yml resolvemos el problema.

Al principio me fajaba con el en.yml y trataba de ponerle cosas, pero luego descubrí que hay una especie de esqueleto en la gema de active_support.

En vez de escribir un en.yml desde cero, podemos usar el que está en active_support. Ejecuta este comando:

“buscando el en.yml”
1
 gem  cont activesupport|grep en.yml

Copia dicho fichero a tu config/locales/en.yml y comencemos a editarlo.

En la linea 30 y pico. Hay una cláusula llamada month_names, ahí le pones los meses. A mi me quedó así:

“month_names, cerca de la linea 30”
1
2
3
    # Don't forget the nil at the beginning; there's no such thing as a 0th month
    month_names: [~, Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Septiembre, Octubre, Novimebre, Diciembre]
    abbr_month_names: [~, Ene, Feb, Mar, Abr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec]

Además, más abajo, por la linea 40, tienes el orden en el que se muestra la fecha.

“order: bajo la linea 40”
1
2
3
4
5
# Used in date_select and datetime_select.
order:
  - day
  - month
  - year

A mi me quedó así, porque los yumas ponen el mes delante y el día detrás.

Si miras más abajo, verás que tiene incluso la moneda (currency) y los separadores, por ejemplo, usar coma en vez de punto para separar los decimales. También están los numerales (millones, millares, centenas, etc…)

Hay un método muy curioso que yo uso mucho. Convierte un array en una oración delimitada por coma; pero pone una conjunción “y” en el último elemento.

‘to_sentence’
1
2
3
4
5
irb(main):> %w[perros gatos].to_sentence
=> "perros y gatos"

irb(main):> %w[papas malangas calabazas].to_sentence
=> "papas, malangas y calabazas"

El separador se configura ahí también. Por defecto dice “and” en vez de “y

Conclusión:

La instrumentación de active_support (ese nombre tan suigeneris se lo pusieron ellos) es bastante rica. Deberían verla bien de cerca. La guia es bastante escueta; te recomiendo que mires un poco el código fuente de active_support o la documentación de la API (que es casi lo mismo).

Si buscas en la misma ruta, pero con model donde dice support verás el YAML que utiliza ActiveRecord para generar los errores de validación. Ahí puedes ponerlos a tu manera. Osea, el contenido de ese YAML se lo adicionas al tuyo.

Si este artículo te resultó interesante, considere donar 0.08 BTC: 1Kg4gu3e7u8HUw8bj5NbBciRg6Y56kuFCU

Comments