Ruby et son puissant système de template : ERB

Un moteur de template est un système permettant de facilement replacer des variables ou des expressions par des valeurs dans des fichiers ou chaînes de caractères. Ruby fournis dans sa librairie standard un moteur très connu : ERB. Si vous êtes utilisateurs de Rails, vous avez certainement déjà utilisé ERB, Slim ou HAML. Nous allons voir comment en tirer avantage dans des scripts Ruby, ou hors du contexte MVC de Rails.

Le cas de Ruby on Rails

Les utilisateurs de Rails le savent, son architecture MVC est très puissante. On peut par exemple y faire cohabiter des view utilisant des templates ERB avec des templates HAML. Rails va se référer à l’extension des fichiers pour automatiquement exécuter les moteurs de template correspondants.

Dans ces fichiersn on peut y placer des expressions, des appels aux méthodes des Helpers, aux méthodes du contrôleur. Très pratique.

Utilisation simple d’ERB

Voici comment simplement utiliser le moteur de template pour interpréter une simple opération arithmétique :

require 'erb'

string = '2 + 2 = <%= 2 + 2 %>'
puts ERB.new(string).result
#=>  2 + 2 = 4

Facile ! On n’a eu qu’à créer un nouvel objet ERB en passant la chaîne de caractère (qui pourrait provenir d’un fichier par exemple), puis d’appeler result et le tour est joué.

`Binding’ pour donner accès aux variables locales

Que se passerait-il si nous essayons d’accéder à une variable locale ? Essayons de créer une variable locale puis de l’appeler dans le contexte du template. Voici le code :

local_var = 'bonjour'
string = 'La variable contient <%= local_var %>'
puts ERB.new(string).result

# => Exception NameError
#   undefined local variable or method `local_var'

Le code lève une exception, car la variable local_var n’existe pas dans le contexte d’exécution du template.

Newsletter

Afin de donner accès au contexte local (et à toutes les variables locales) il faudra créer un objet Binding et le passer à la méthode result, comme ceci :

local_var = 'bonjour'
string = 'La variable contient <%= local_var %>'
# L'objet Binding fournis l'accès aux variables locales
bind = binding
puts ERB.new(string).result bind

# => La variable contient bonjour

Comme son nom l’indique l’objet Binding permet de faire le lien entre les contextes et donc de donner accès aux variables locales à un autre contexte, en l’occurrence celui où s’exécute le template. Il conviendra de se rappeler que l’objet Binding devra être créé après que la variable locale ait été définie, sinon il ne la verra pas et vous aurez le message d’erreur vu précédemment.

Utilisation d’un proxy

Un proxy fait l’interface entre la source de donnée et le moteur de template. L’utilisation d’un objet proxy peut s’avérer très utile pour préparer, modifier, ou générer des valeurs qui seront à utiliser dans le template. Le contexte (et ses variables locales) proviendra de l’objet proxy. Par exemple :

# Notre source de donnée
class Server
  attr_accessor :host
  attr_accessor :scheme

  def initialize(host, scheme)
    self.host, self.scheme = host, scheme
  end
end

# Le proxy
class Proxy
  def initialize(server)
    @server = server
  end

  def url
    "#{@server.scheme}://#{@server.host}"
  end

  def get_binding
    binding
  end
end

# Création des instances
server = Server.new 'test.local', 'https'
proxy = Proxy.new server

# Génération du template
#   on fait appel à la méthode url
#   qui provient du proxy
string = "L'url du serveur est <%= url %>"

# Exécution du template "bindé" au proxy
puts ERB.new(string).result proxy.get_binding

#=> L'url du serveur est https://test.local

Comme on a pu le voir dans cet exemple, un objet proxy peut servir à préparer les données avant d’être envoyées au template. On peut imaginer des scénarios où différents objets servent de source de donnée et le -ou les- proxies servent à unifier l’interface avec le template.

Publié par

Benj

Artisan du web à plusieurs facettes, du développement à la gestion de produits complexes en passant par le pilotage de projets internationaux.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

8 + dix-huit =