Я использую перечисления в Rails 4.1, чтобы отслеживать цвета вина.
Wine.rb
class Wine < ActiveRecord::Base
enum color: [:red, :white, :sparkling]
end
На мой взгляд, я создаю выбор, чтобы пользователь мог выбрать вино определенного цвета.
f.input :color, :as => :select, :collection => Wine.colors
Это генерирует следующий 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>
Однако при отправке формы я получаю сообщение об ошибке аргумента '1' is not a valid color
. Я понимаю, что это потому, что color
надо равняться, 1
а нет "1"
.
Есть ли способ заставить Rails интерпретировать цвет как целое число, а не строку?
источник
f.select :color, Wine.colors.to_a.map { |w| [w[0].humanize, w[0]] }
потому чтоw
представляет собой массив. Не знаю почему, но, возможно, это кому-то поможет.titleize
может быть лучшей идеей, если у вас есть два или более словkeys
метод возвращает массив таким образом ,to_a
является избыточным. В качестве альтернативы вспомогательный метод select принимает 2D-массив для параметров, поэтому вы можете просто использоватьto_a
.enum color: [:red, :white, :sparkling]
поэтому правильное предложениеf.input :color, :as => :select, :collection => Wine.color.keys.to_a
Нет необходимости преобразовывать хэш перечисления в массив с помощью
to_a
. Этого достаточно:источник
Я только что собрал EnumHelper, которым, как я думал, поделюсь, чтобы помочь людям, которым нужны более настраиваемые метки перечисления и локали для выбранных вами перечислений.
В вашем регионе:
По вашему мнению:
источник
[I18n.t("activerecord.enums.#{klass.underscore}.#{enum}.#{key}", default: key.humanize), key]
Кроме того, удалите последнее,humanize
поскольку оно может исказить заглавные буквы, если в нем несколько словПринятое решение не сработало для меня для человека, читаемого человеком , но я смог заставить его работать следующим образом:
Это был самый чистый, но мне действительно нужно было очеловечить мои ключи:
источник
Если вы используете enum в Rails 4, просто позвоните
Model.enums
:Чтобы создать HTML:
Или добавьте метод в контроллер:
источник
Вот что у меня сработало, Rails 4+:
в
my _form.html.erb
, у меня это:тест из Консоли после добавления записи:
источник
Если вам нужно обрабатывать i18n на основе ключей перечисления, вы можете использовать:
а в переводах вы можете установить цвета:
источник
Вот мое решение (в моих ролях есть символы подчеркивания, такие как «sales_rep»), и по какой-то причине мне нужно было заставить работать пустой параметр (с простой формой?):
В ApplicationHelper:
Тогда в моей форме:
источник