Lorsque vous développez un plugin pour rails, il peut être utile que l'utilisateur de ce plugin crée divers fichiers (par exemple de configuration) dans son projet. Par exemple, rspec crée le fichier spec/spec_helper.rb. Ainsi que vos fichiers de test à chaque fois que vous créez un nouveau modèle, contrôleur ou autre.
Pour faciliter la création de ces fichiers dans votre projet, rails propose divers helpers permettant de créer des templates de fichiers. Supposons un plugin que nous nommerons foo. Dans ce plugin, nous désirons créer le modèle User. Ce modèle contiendra, comme son nom l'indique, des utilisateurs !
Un premier générateur
Commencez par créer le dossier foo/lib/generators, dans lequel vous créerez le fichier user_generator.rb. Dans ce fichier, nous placerons la classe suivante :
module Foo
class UserGenerator < Rails::Generators::Base
source_root File.expand_path("../templates", __FILE__)
# Chaque méthode publique ici sera exécutée dans l'ordre
def add_user_model
template "user_model.rb", "app/models/user.rb"
end
end
end
Nous créons une classe du nom de notre générateur (le nom est très important et doit correspondre au nom du fichier. Sinon rails ne trouvera pas le générateur).
Puis nous définissons le chemin vers les fichiers de template :
source_root File.expand_path("../templates", __FILE__)
Enfin nous définissons une méthode qui créera le fichier de notre modèle et y insérera le contenu du template :
def add_user_model
template "user_model.rb", "app/models/user.rb"
end
Vous pouvez créer autant de méthodes que vous le désirez. Toutes les méthodes publiques seront exécutées dans l'ordre dans lequel elles sont définies.
Puis créez un fichier foo/lib/generators/templates/user_model.rb Qui contiendra ceci :
class User < ActiveRecord::Base
end
Parce que notre générateur s'appelle "user", vous pouvez l'exécuter après avoir installé le plugin dans votre projet rails, en tapant :
script/rails generate foo:user
Ce qui aura pour effet de créer le modèle User dans le répertoire approprié.
Générateurs nommés
Si vous avez un petit peu d'expérience avec rails, vous avez probablement déjà utilisé l'un des générateurs natifs. Par exemple nous pourrions créer notre précédent modèle User de la manière suivante :
script/rails generate model user
Si vous souhaitez créer ce type de générateur, vous pouvez faire hériter celui-ci de Rails::Generators::NamedBase.
Ainsi, diverses méthodes supplémentaires seront à votre disposition.
class_pathetfile_namesont extraits des paramètres passés. Par exemple si vous avez entréadmin/posts, class_path sera égal à admin et file_name à posts.file_pathest class_path et file_name séparés par un /.class_nameest le nom de la classe. Par exemple admin/posts deviendrait Admin::Postshuman_nameest le nom de la classe "humanisé". Par exemple admin/posts deviendrait Admin posts.plural_nameest le nom du fichier au pluriel. Par exemple post deviendrait posts.i18n_scopeest le file_path avec les slash (/) remplacé par des points (.). Par exemple admin/posts deviendrait admin.posts.
Ainsi nous pourrions créer un générateur plus générique avec la commande
script/rails generate foo:user people
Qui créerait un modèle nommé People et non plus User. Exemple :
module Foo
class UserGenerator < Rails::Generators::NamedBase
source_root File.expand_path("../templates", __FILE__)
# Chaque méthode publique ici sera exécutée dans l'ordre
def add_user_model
template "user_model.rb", "app/models/#{file_name}.rb"
end
end
end
Vous noterez l'utilisation de la variable file_name nous permettant de définir de manière dynamique le nom du fichier qui sera créé.
Et le contenu de notre template :
class <%= class_name %> < ActiveRecord::Base
end
Vous noterez l'utilisation de la variable class_name qui nous permet de définir de manière dynamique le nom de notre nouveau modèle.
Conclusion
Avec les générateurs, vous pouvez ainsi créer tous les fichiers dont votre plugin ou gem aura besoin pour tourner correctement autour de votre application rails. Si vous souhaitez en savoir plus quant à ces générateurs, je vous invite à lire l'article Creating and Customizing Rails Generators.


Commentaires