Le Blog du Geek Joyeux

Plus moins vite tu codes, moins plus vite ça plante

Définir une ressource Active Admin dans une gem

| Commentaires

Si vous utilisez Active Admin pour générer vos interfaces d’administration sous Rails, voici une technique pour définir des ressources depuis un engine.

Définir la ressource

Pour une question de simplicité, je place mes ressources dans un dossier admin situé dans le dossier lib/my_engine de mon engine.

1
2
3
4
5
6
# lib/my_engine/admin/articles.rb
if defined?(ActiveAdmin)
  ActiveAdmin.register Article do
    # personnalisez ici votre ressource
  end
end

Charger la ressource

Le problème auquel j’ai été confronté au début était celui du chargement de cette ressource.

Naïvement, je l’avais placée dans app/admin/articles.rb dans mon engine mais elle n’était pas chargée par l’application. Je l’ai ensuite placée dans lib/my_engine/admin et ai appelé require dessus. Le problème est que le modèle Article n’était pas encore défini au moment de l’appel à register.

J’ai donc fait appel à after_initialize dans la définition de l’engine:

1
2
3
4
5
6
7
8
# lib/my_engine/engine.rb
module MyEngine
  class Engine < Rails::Engine
    config.after_initialize do
      require 'my_engine/admin/articles'
    end
  end
end

Ce n’est peut être pas la solution la plus optimale ou la plus propre. Je serais d’ailleurs ravi d’avoir une solution alternative plus efficace. Celle-là a le mérite de fonctionner :).

Commentaires