Estou usando os enums no Rails 4.1 para controlar as cores do vinho.
Wine.rb
class Wine < ActiveRecord::Base
enum color: [:red, :white, :sparkling]
end
Na minha opinião, eu gero um select para que o usuário possa selecionar um vinho com uma determinada cor
f.input :color, :as => :select, :collection => Wine.colors
Isso gera o seguinte 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>
No entanto, ao enviar o formulário, recebo um erro de argumento informando '1' is not a valid color
. Eu percebo que isso é porque color
deve ser igual 1
e não "1"
.
Existe uma maneira de forçar o Rails a interpretar a cor como um inteiro ao invés de uma string?
fonte
f.select :color, Wine.colors.to_a.map { |w| [w[0].humanize, w[0]] }
porquew
representava uma matriz. Não sei por que, mas talvez isso ajude alguém.titleize
pode ser uma ideia melhor se você tiver duas ou mais palavraskeys
método retorna uma matriz, portanto, oto_a
é redundante. Alternativamente, o método auxiliar de seleção usa uma matriz 2D para opções para que você possa apenas usarto_a
.enum color: [:red, :white, :sparkling]
então a frase correta éf.input :color, :as => :select, :collection => Wine.color.keys.to_a
Não há necessidade de converter o hash enum em array com
to_a
. Isso é suficiente:fonte
Acabei de criar um EnumHelper que pensei em compartilhar para ajudar as pessoas que precisam de rótulos e locais de enum mais personalizados para suas seleções de enum.
Em sua localidade:
Em suas opiniões:
fonte
[I18n.t("activerecord.enums.#{klass.underscore}.#{enum}.#{key}", default: key.humanize), key]
Além disso, remova o últimohumanize
, pois pode distorcer a capitalização se houver várias palavrasA solução aceita não funcionou para mim para a leitura humana , mas fui capaz de fazê-la funcionar assim:
Este foi o mais limpo, mas eu realmente precisava humanizar minhas chaves:
fonte
Se você usar enum no Rails 4, basta chamar
Model.enums
:Para criar HTML:
Ou adicione o método no controlador:
fonte
Aqui está o que funcionou para mim, Rails 4+:
em
my _form.html.erb
, eu tenho isso:teste do console após adicionar um registro:
fonte
Se você precisar lidar com o i18n com base nas chaves enum, poderá usar:
e nas traduções você pode definir as cores:
fonte
Esta é minha solução (minhas funções têm sublinhados como "sales_rep") e, por algum motivo, foi assim que eu precisei fazer com que uma opção em branco funcionasse (com o simpleform?):
Em ApplicationHelper:
Então, na minha forma:
fonte