Как правильно настроить Rails 4.1 Перечисления в ActiveAdmin
У меня есть приложение Rails 4.1, в котором я использую перечисление для представления уровня конфиденциальности объекта.
В моей схеме:
t.integer "privacy_level", default: 0
В моей модели:
enum privacy_level: { privacy_private: 0, privacy_trusted: 1, privacy_public: 2 }
В моем регистровом файле ActiveAdmin:
index do
column :privacy_level
default_actions
end
form do |f|
f.inputs "Edit My Model" do
f.input :privacy_level
end
f.actions
end
На странице индекса ActiveAdmin он отлично работает. Уровень конфиденциальности каждого объекта отображается как "privacy_private", "privacy_trusted" и "privacy_public".
Однако, когда я пытаюсь отредактировать объект, тип ввода - это числовое окно со стрелками вверх и вниз, которое позволяет мне помещать любое целое число, независимо от того, является ли целое число действительным уровнем конфиденциальности (даже отрицательные значения).
То, что я хотел бы увидеть, это выпадающий (select) ввод с тремя перечисленными строковыми значениями, определенными в моей модели.
Ответы
Ответ 1
Построение ответа Джека, вот что сработало для меня. Скажем, ваша модель ActiveRecord Tweets
:
f.input :privacy_level, as: :select, collection: Tweet.privacy_levels.keys
Ключевые моменты, которые следует отметить здесь:
- у вашего ActiveRecord есть полезный словарь (доступный в enum_name.pluralize) ключей перечисления к значениям.
- использование строк (и игнорирование основного целочисленного представления) упрощает запись в значение перечисления.
Ответ 2
Чтобы использовать перечисления в фильтрах ActiveAdmin, используйте:
filter :level, as: :select, collection: Model.levels
предполагая атрибут enum
с именем level
Это позволит фактически поместить целочисленное значение в запрос, а не имя ключа.
Ответ 3
сделайте следующее:
f.input :privacy_level, :as => :select, :collection => privacy_level.keys.to_a