rails how enum each_with_index docs application all ruby-on-rails enums activeadmin

ruby-on-rails - how - ruby docs enumerable



Cómo configurar correctamente las enumeraciones de Rails 4.1 en ActiveAdmin (3)

Tengo una aplicación Rails 4.1 en la que uso una enumeración para representar el nivel de privacidad de un objeto.

En mi esquema:

t.integer "privacy_level", default: 0

En mi modelo:

enum privacy_level: { privacy_private: 0, privacy_trusted: 1, privacy_public: 2 }

En mi archivo de registro 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

En la página de índice ActiveAdmin, funciona muy bien. El nivel de privacidad de cada objeto se muestra como "privacy_private", "privacy_trusted" y "privacy_public".

Sin embargo, cuando trato de editar un objeto, el tipo de entrada es un cuadro numérico con flechas hacia arriba y hacia abajo que me permite colocar cualquier número entero, independientemente de si el número entero es un nivel de privacidad válido (incluso valores negativos).

Lo que me gustaría ver es una entrada desplegable (selección) con los tres valores de cadena enumerados que definí en mi modelo.


Aprovechando la respuesta de Jack, esto es lo que funcionó para mí. Digamos que su modelo ActiveRecord es Tweets :

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

Cosas clave a tener en cuenta aquí:

  • su ActiveRecord tiene un diccionario útil (disponible en enum_name.pluralize) de enumeración de claves a valores.
  • el uso de cadenas (e ignorar la representación de enteros subyacente) hace que sea más fácil escribir en el valor de enumeración.

Para usar las enumeraciones en los filtros de ActiveAdmin use:

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

asumiendo un atributo de enum llamado level

Esto se asegurará de poner realmente el valor entero en la consulta y no el nombre de la clave.


hacer esto:

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