Comment configurer correctement les Rails 4.1 Enums dans ActiveAdmin
j'ai une application Rail 4.1 dans laquelle j'utilise un enum pour représenter le niveau de confidentialité d'un objet.
Dans mon schéma:
t.integer "privacy_level", default: 0
Dans mon modèle:
enum privacy_level: { privacy_private: 0, privacy_trusted: 1, privacy_public: 2 }
Dans mon ActiveAdmin fichier de registre:
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
sur la page d'index ActiveAdmin, cela fonctionne très bien. Le niveau de confidentialité de chaque objet apparaît comme "privacy_private", "privacy_trusted"et " privacy_public".
Cependant, lorsque j'essaie de modifier un objet, le type d'entrée est un nombre boîte avec des flèches haut et bas qui me permettent de mettre n'importe quel entier dedans, indépendamment du fait que l'entier soit ou non un niveau de vie privée valide (même des valeurs négatives).
ce que je voudrais voir est une entrée dropdown (select) avec les trois valeurs de chaîne énumérées que j'ai définies dans mon modèle.
3 réponses
en S'appuyant sur la réponse de Jack, voici ce qui a fonctionné pour moi. Dites que votre modèle ActiveRecord est Tweets
:
f.input :privacy_level, as: :select, collection: Tweet.privacy_levels.keys
Clé de choses à noter ici:
- votre ActiveRecord a un dictionnaire (disponible à l'enum_name.au pluriel) de l'enum clés à des valeurs.
- l'utilisation de chaînes (et l'ignorance de la représentation entière sous-jacente) rend plus facile d'écrire à la valeur enum.
pour utiliser les énumérations dans ActiveAdmin de filtres à utiliser:
filter :level, as: :select, collection: Model.levels
en supposant un enum
l'attribut level
ceci fera en sorte de réellement mettre la valeur entière dans la requête et pas le nom de la clé.
faire ceci:
f.input :privacy_level, :as => :select, :collection => privacy_level.keys.to_a