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.

28
demandé sur Pop-A-Stash 2014-05-01 23:17:45

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.
49
répondu AlexeyMK 2014-05-22 06:42:21

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é.

23
répondu ChrHansen 2014-08-22 00:23:22

faire ceci:

f.input :privacy_level, :as => :select, :collection =>  privacy_level.keys.to_a
7
répondu jimagic 2014-05-01 19:54:21