Rails : Templates
Par Bounga le vendredi, 30 janvier 2009, 16:27 - Documentations - Lien permanent
Une nouvelle fonctionnalité très intéressante vient d'être introduite dans Rails Edge et fera son chemin dans Rails 2.3 à priori. Ce sont les Templates.
Ces templates permettent, via du code Ruby, de créer des gabarits de projet qui permettent d'automatiser la phase de personnalisation de votre projet Rails quasi-obligatoire avant d'écrire la moindre ligne de code.
Les Templates sont donc des fichiers Ruby écrit à l'aide d'un DSL qui permettent d'ajouter dynamiquement des plugins, gems, initializers ou encore de modifier des fichiers existants dans votre projet Rails nouvellement créé.
Mais comment ça fonctionne ?
Tout d'abord pour créer un nouveau projet utilisant votre template, vous devez passer par l'option "-m" de la ligne de commande :
rails blog -m ~/template.rb # ou rails blog -m http://host.com/template.rb
Vous pouvez également appliquer un template à un projet existant grâce à une tâche Rake :
rake rails:template LOCATION=~/template.rb
À quoi ressemble un fichier template ?
# template.rb run "rm public/index.html" generate(:model, "News title:string body:text") generate(:controller, "News") route "map.root :controller => 'news'" rake("db:migrate") run 'hg init .' run 'hg add' run 'hg commit -m "Initial import"'
Quelques exemples d'utilisation du DSL
gem
gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net"
va ajouter la dépendance au gem hpricot à votre fichier environment.rb.
Il vous suffira ensuite d'appeler
rake "gems:install"
pour que Rails installe vos Gems si ce n'est pas déjà fait.
plugin
plugin(name, options = {})
permet d'installer un plugin, comme par exemple :
plugin 'restful_authentication', :git => 'git://github.com/technoweenie/restful-authentication.git'
initializer
initializer(filename, data = nil, &block)
permet de créer un fichier initializer dans le répertoire 'config/initializers', par exemple :
initializer 'globalize.rb', %q{include Globalize Locale.set_base_language('fr-FR') LOCALES = {'en' => 'en-US', 'fr' => 'fr-FR'}.freeze }
Vous pouvez également utiliser lib qui permet de créer un fichier dans le répertoire 'lib' et vendor qui ajoute un fichier dans le répertoire 'vendor'.
file
Pour créer des fichiers à un autre endroit de l'arborescence, vous pouvez utiliser file.
file 'app/views/shared/_flash.rb',
%q{<div id="flash">
<% flash.each do |key, value| -%>
<div id="flash_<%= key %>"><%=h value %></div>
<% end -%>
</div>
}
vous aurez donc un nouveau répertoire 'shared' contenant le fichier '_flash.rb'.
rakefile
rakefile(filename, data = nil, &block)
permet de créer un nouveau fichier Rake dans 'lib/tasks' :
rakefile("bounga.rake"), %q{namespace :bounga do task :hello do puts "Kawa Bounga!" end end } end
Vous avez donc maintenant un nouveau fichier 'lib/tasks/bounga.rake' et une nouvelle tâche disponible dans Rake.
generate
generate(what, args)
permet d'appeler un générateur :
generate(:model, "Actor", "name:string", "age:number")
run
run(command)
permet d'appeler une commande système exactement comme le ferait l'appel à system().
run "rm public/index.html"
rake
rake(command, options = {})
exécute une tâche Rake :
rake "db:migrate" # ou rake "db:migrate", :env => 'production' # ou encore rake "gems:install", :sudo => true
route
route(routing_code)
permet d'ajouter une nouvelle règle pour vos routes dans le fichier 'config/routes.rb' :
route "map.root :controller => :actors"
inside
inside(dir)
permet d'effectuer une ou plusieurs actions dans un répertoire donné :
inside('vendor') do run "git clone git://github.com/rails/rails.git" end
ask
ask(question)
vous permet de poser une question à l'utilisateur pour ensuite d'utiliser sa réponse :
name = ask("Quel est votre nom ?") file 'COPYRIGHT', <<-CODE Copyright #{name} #{Time.now.year} CODE
Oui ou non ?
yes?(question) no?(question)
permet de demander à l'utilisateur de faire un choix concernant une action donnée :
rake("rails:freeze:gems") if yes?("Voulez-vous freezer Rails ?")
git
Et voici comment faire des appels à git :
git :init git :add => "." git :commit => "-a -m 'Initial commit'"
Des exemples complets ?
Si cette nouvelle fonctionnalité vous intéresse, vous pouvez déjà trouver un repository Git sur lequel des contributeurs s'échangent des templates.
Un récapitulatif des changements dans Rails 2.3
Je vous conseille de jeter un oeil aux Release Notes de Rails 2.3 pour plus de détails sur les nouveautés
Il ne me reste plus qu'à écrire mon propre template maintenant !
Bon amusement à vous.