J'utilise les enums dans Rails 4.1 pour garder une trace des couleurs du vin.
Wine.rb
class Wine < ActiveRecord::Base
enum color: [:red, :white, :sparkling]
end
À mon avis, je génère une sélection pour que l'utilisateur puisse sélectionner un vin avec une certaine couleur
f.input :color, :as => :select, :collection => Wine.colors
Cela génère le HTML suivant:
<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>
Cependant, lors de la soumission du formulaire, je reçois une erreur d'argument indiquant '1' is not a valid color
. Je me rends compte que c'est parce qu'il color
faut égaler 1
et non "1"
.
Existe-t-il un moyen de forcer Rails à interpréter la couleur comme un entier plutôt que comme une chaîne?
la source
f.select :color, Wine.colors.to_a.map { |w| [w[0].humanize, w[0]] }
carw
représentait un tableau. Je ne sais pas pourquoi, mais peut-être que cela aidera quelqu'un.titleize
pourrait être une meilleure idée si vous avez deux mots ou pluskeys
méthode renvoie un tableau donc leto_a
est redondant. Alternativement, la méthode d'aide à la sélection prend un tableau 2D pour les options que vous pouvez simplement utiliserto_a
.enum color: [:red, :white, :sparkling]
donc la phrase correcte estf.input :color, :as => :select, :collection => Wine.color.keys.to_a
Pas besoin de convertir le hachage enum en tableau avec
to_a
. Cela suffit:la source
Je viens de créer un EnumHelper que je pensais partager pour aider les personnes qui ont besoin d'étiquettes d'énumération et de paramètres régionaux plus personnalisés pour vos sélections d'énumération.
Dans votre région:
À votre avis:
la source
[I18n.t("activerecord.enums.#{klass.underscore}.#{enum}.#{key}", default: key.humanize), key]
supprimez également le dernierhumanize
car il peut déformer la capitalisation si ses mots multiplesLa solution acceptée n'a pas fonctionné pour moi pour la lecture humaine , mais j'ai pu la faire fonctionner comme ceci:
C'était le plus propre, mais j'avais vraiment besoin d'humaniser mes clés:
la source
Si vous utilisez enum dans Rails 4, appelez simplement
Model.enums
:Pour créer du HTML:
Ou ajoutez une méthode dans le contrôleur:
la source
Voici ce qui a fonctionné pour moi, Rails 4+:
dans
my _form.html.erb
, j'ai ceci:test depuis la console après l'ajout d'un enregistrement:
la source
Si vous devez gérer le i18n en fonction des clés d'énumération, vous pouvez utiliser:
et dans les traductions, vous pouvez définir les couleurs:
la source
Voici ma solution (mes rôles ont des traits de soulignement comme "sales_rep"), et pour une raison quelconque, c'était comme ça que j'avais besoin d'obtenir une option vide pour fonctionner (avec simpleform?):
Dans ApplicationHelper:
Puis sous ma forme:
la source