Как правильно настроить перечисления 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) вход с тремя перечисленными строковыми значениями, которые я определил в своей модели.

3 28

3 ответа:

Основываясь на ответе Джека, вот что сработало для меня. Допустим, ваша модель ActiveRecord Tweets:

f.input :privacy_level, as: :select, collection: Tweet.privacy_levels.keys

Ключевые вещи, которые следует отметить здесь:

  • Ваш ActiveRecord имеет полезный словарь (доступен по адресу enum_name.pluralize) перечисления ключей к значениям.
  • использование строк (и игнорирование базового целочисленного представления) облегчает запись в значение enum.

Для использования перечислений в фильтрах ActiveAdmin используйте:

filter :level, as: :select, collection: Model.levels

Предполагая атрибут enum с именем level

Это гарантирует, что в запрос будет введено целочисленное значение, а не имя ключа.

Сделайте так:

f.input :privacy_level, :as => :select, :collection =>  privacy_level.keys.to_a