Estoy usando las enumeraciones en Rails 4.1 para realizar un seguimiento de los colores del vino.
Wine.rb
class Wine < ActiveRecord::Base
enum color: [:red, :white, :sparkling]
end
En mi opinión, genero una selección para que el usuario pueda seleccionar un vino con un color determinado.
f.input :color, :as => :select, :collection => Wine.colors
Esto genera el siguiente HTML:
<select id="wine_color" name="wine[color]">
<option value=""></option>
<option value="0">red</option>
<option value="1">white</option>
<option value="2">sparkling</option>
</select>
Sin embargo, al enviar el formulario, recibo un error de argumento que indica '1' is not a valid color
. Me doy cuenta de que esto se debe a que color
debe ser igual 1
y no "1"
.
¿Hay alguna forma de obligar a Rails a interpretar el color como un número entero en lugar de una cadena?
fuente
f.select :color, Wine.colors.to_a.map { |w| [w[0].humanize, w[0]] }
porquew
representaba una matriz. No estoy seguro de por qué, pero tal vez esto ayude a alguien.titleize
podría ser una mejor idea si tiene dos o más palabraskeys
método devuelve una matriz, por lo queto_a
es redundante. Alternativamente, el método de ayuda de selección toma una matriz 2D para opciones para que pueda usarto_a
.enum color: [:red, :white, :sparkling]
por lo que la oración correcta esf.input :color, :as => :select, :collection => Wine.color.keys.to_a
No es necesario convertir el hash de enumeración en una matriz con
to_a
. Esto es suficiente:fuente
Acabo de armar un EnumHelper que pensé en compartir para ayudar a las personas que necesitan etiquetas de enumeración y configuraciones regionales más personalizadas para sus selecciones de enumeración.
En su localidad:
En sus opiniones:
fuente
[I18n.t("activerecord.enums.#{klass.underscore}.#{enum}.#{key}", default: key.humanize), key]
Además, elimina el último,humanize
ya que puede distorsionar las mayúsculas si son varias palabrasLa solución aceptada no funcionó para mí para la lectura humana , pero pude hacer que funcionara así:
Este fue el más limpio, pero realmente necesitaba humanizar mis llaves:
fuente
Si usa enum en Rails 4, simplemente llame
Model.enums
:Para crear HTML:
O agregue el método en el controlador:
fuente
Esto es lo que funcionó para mí, Rails 4+:
en
my _form.html.erb
, tengo esto:prueba desde la consola después de agregar un registro:
fuente
Si necesita manejar el i18n en función de las claves de enumeración, puede usar:
y en las traducciones puedes configurar los colores:
fuente
Aquí está mi solución (mis roles tienen guiones bajos como "sales_rep"), y por alguna razón, así era como necesitaba obtener una opción en blanco para trabajar (¿con simpleform?):
En ApplicationHelper:
Entonces en mi forma:
fuente