Подтвердить что ты не робот

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

4b9b3361

Ответ 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