Edouard :
1/
Je voudrais tout simplement placer tout les messages de mes vues
dans des fichiers externes afin de minimiser leurs redondances et de les
modifier rapidement. Je n’ai pas de véritables besoins de traduction.
Ce que tu peux faire, c’est mettre tes messages dans un fichier YAML
(par exemples dans RAILS_ROOT/messages/messages.yml ),
ça ressemblera à :
bonjour: Bonjour
au_revoir: Au revoir
…
Ce fichier sera lu au démarrage et les messages seront stockés dans un
Hash qui sera converti en un objet HashWithIndifferentAccess constant,
appelons le MESSAGES.
dans lib/
class String
def unspacify!
self.gsub!(/ /, ‘_’)
end
end
class Symbol
def unspacify!
self
end
end
Définir un helper dans application_helper.rb qui ressemblerait à ça :
(m comme message, mais tu es libre de choisir un autre nom de méthode)
def m(msg)
msg.unspacify!
MESSAGES.has_key?(msg) ? MESSAGES[msg] : ‘message non disponible’
end
Dans ta vue, tu pourras alors faire des :
<%=m :bonjour %>
ou
<%=m :au_revoir %>
ou <%=m ‘au revoir’ %>
Après, on peut faire des choses plus compliquées si on veut traiter des
messages comme “Il y a 5 produits.”
dans messages.yml
quantite_produit: Il y a %d produits.
alors on peut modifier m() comme ça par exemple :
def m(msg, *args)
msg.unspacify!
if MESSAGES.has_key?(msg)
if args.empty?
MESSAGES[msg]
else
MESSAGES[msg] % args
end
else
‘message non disponible’
end
end
pour aboutir à <%=m(:quantite_produit, 5) %>
Si on veut être plus rigoureux, il faut traiter les singuliers/pluriels

vérifier le bon nombre d’arguments utilisé par message (par
exemple dans MESSAGES, au lieu d’avoir des String comme
valeurs,on pourrait avoir des objets Messages qui auront le
nombre d’arguments et la chaîne comme variable d’instance,
le nbre d’arguments étant déterminé en parsant la chaîne en
recherchant les %s, %d…), etc.
2/
D’autre part j’ai lu pas mal de chose sur les engine. Des avis plutot
divergeant mais avez vous des retours de prod ? Est ce que c’est
complexe à déployer/maintenir ?
Je n’ai jamais été fan des Engines, sans vraiment savoir pourquoi
donc je n’utilise pas trop ce système. Je ne vois pas trop pourquoi
ce serait plus compliqué à maintenir qu’un plugin lambda.
ça rajoute une couche, donc ça rajoute un risque. Par exemple,
lors d’une mise à jour de Rails, ton appli Rails en elle-même ne
marche plus, ou le système d’Engines ne marche plus, ou ton Engine
ne marche plus. Mais si utilises plutôt un plugin, les risques sont :
- ton appli Rails ne marche plus
- ton ou tes plugins ne marchent plus.
t’as aussi des risques, mais t’as une dépendence en moins.
Pour terminer, j’ai une question sur l’architecture d’une appli rails.
Après avoir lu des tutos, étudier des applis rails, je me rends compte
que quelque chose m’échappe. Très peu d’applis laissent leurs codes dans
des controllers sous la forme de “module” (/app/controller/arborescence
Ben si, il y en a.
… ). Certaines se servent du répertoire component,
bah pourquoi pas si on aime les composants.
d’autre de library, d’autre place le maximum dans un engine …
Mais pour moi c’est essentiellement 2 questions, une question
d’extraction, quelles sont les fonctionnalités que je peux extraire
de mon appli qui pourrait être commune à une autre et que je
pourrais donc réutiliser. Par exemple, l’histoire d’affichage de
messages du début, on peut peut-être l’extraire et en faire
une lib (si c’est pas spécifique à Rails), un plugin (si ça l’est),
un component ou un engine s’il y a une interface qui va avec.
La deuxième question est, est-ce que je souhaite extraire
l’interface avec ? Par exemple, supposons que je fasse un wiki
et que je souhaite l’extraire. Soit, j’en fais un component ou un
engine et je fournis l’interface (les vues, le css, le layout) prêt
à l’emploi. Soit j’en fais un plugin, sans trop d’interface mais
avec les fonctionnalités et dans mon autre site web, je construis
l’interface du wiki, soit encore je fournis un générateur qui
fournit les fonctionnalités du wiki et un minimum d’interface
(comme le scaffold, ça permet de voir si ça marche et ensuite
on casse toutes les vues pour coller à notre interface et la
charte graphique). Donc, en gros, soit je fournis une interface,
et le boulot consistera à le faire fondre dans l’interface générale
de mon site web, soit il n’y en a pas ou très peu, et le boulot
consistera à la construire. (quand je parle d’interface, ce n’est
pas seulement une feuille de style et des images, c’est la
structure html, comment les liens hypertexte s’organise, la
présentation des informations… : même si le CSS change,
on repère tout de suite un DotClear, un MediaWiki, un Instiki,
un Dokuwiki, un Trac, un phpBB, un IMP ou un Plone… la question
est de savoir si c’est gênant ou pas)
Quelle est à votre avis la meilleure façon de réaliser une application
rails performante et évolutive ???
En gros et en une phrase : tu peux refactoriser tant que tu souhaites si
tu as
une batterie de tests qui empêche la non-regression de ton appli (et un
système
de contrôle de versions pour revenir en arrière, si tu as fait fausse
route).
Merci beaucoup d’éclairer ma lanterne, car trop de lecture tue la
lecture …
Mais si tu souhaites qu’on te réponde, comment peux-tu faire
sans lire les réponses ??
-- Jean-François.