Comment exécuter ruby template files (ERB) sans un serveur web depuis la ligne de commande?
j'ai besoin de ERB (Ruby système de template) pour la création de modèles de fichiers non HTML.
(au Lieu de cela, je veux l'utiliser pour les fichiers sources telles que .Java. ,cs,...)
Comment faire "exécuter" les gabarits de Ruby de la ligne de commande?
7 réponses
Vous devriez avoir tout ce dont vous avez besoin dans votre ruby/bin. Sur mon Système (WinXP, Ruby 1.8.6), j'ai ruby/bin/erb.bat
erb.bat [switches] [inputfile]
-x print ruby script
-n print ruby script with line number
-v enable verbose mode
-d set $DEBUG to true
-r [library] load a library
-K [kcode] specify KANJI code-set
-S [safe_level] set $SAFE (0..4)
-T [trim_mode] specify trim_mode (0..2, -)
-P ignore lines which start with "%"
erb your_erb_file.erb
devrait écrire le résultat à STDOUT.
(EDIT: windows has erb.bat et juste "erb". Le. bat file est juste un wrapper pour erb, qui je suppose devrait faire fonctionner la même commande à peu près la même chose sur N'importe quel OS)
voir le prag prog livre discussion (commence à peu près à mi-chemin page.)
Notez aussi que Jack Herrington a écrit un livre en entier à propos de la génération de code qui utilise Ruby/ERB.
Ecrire un script ruby qui le fait. La documentation de L'API est ici: http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/
Par exemple:
template = ERB.new File.read("path/to/template.erb"), nil, "%"
template.result(binding)
(où liaison est une liaison avec les @vars dont le modèle a besoin.)
une autre option serait d'utiliser ruby-e, puisque ERB itslef est si simple.
quelque Chose comme:
ruby -rerb -e "puts ERB.new(File.read(<file name here>)).result"
cependant, je suppose que vous avez un contexte dans lequel vous voulez afficher le modèle. Comment vous attendez-vous à obtenir? Comme un exemple, consultez:
ruby -rerb -e "hello = 'hello'; puts ERB.new('<%= hello %> world').result(binding)"
qui imprimera "hello world", en utilisant le niveau supérieur, où vous avez défini le hello
variable, comme liant.
si vous pouvez changer ERB en Erubis, votre solution est aussi simple que:
require 'erubis'
template = File.read("sample_file.erb")
template = Erubis::Eruby.new(template)
template.result(:your_variable => "sample")
J'ai trouvé cette question en essayant de tester mes modèles de marionnettes.
Terminé avec cette solution:
foo.erb
créer un fichierfoo.vars.erb
mettez toutes vos variables de template dans ce nouveau fichier, par exemple:
<% @my_param="foo bar" %> <% @another_param=123 %>
ou (équivalent):
<% @my_param="foo bar" @another_param=123 %>
Sur la ligne de commande exécuter ceci:
cat foo.vars.erb foo.erb | erb
votre modèle entièrement rendu doit maintenant être imprimé en std-out. À partir de là vous vérifiez la sortie à la main, ou vous pouvez prendre diff (ou d'autres outils) pour la comparer à une sortie pré-rendue.
C'est un bon article de base, - http://rrn.dk/rubys-erb-templating-system Et un de plus ... 3-->http://www.stuartellis.eu/articles/erb/
j'ai essayé de commenter cela, mais le lien Commentaires n'est pas disponible.
j'utilise ceci:
template = ERB.new File.new("path/to/template.erb").read, nil, "%"
template.result(binding)
à Partir de l'affichage ci-dessus: et j'ai trouvé ce que je pense qu'il pourrait être un problème:
je suis de créer des fichiers BATCH DOS de la forme:
%JAVA_HOME%\bin\jar -xvf <%=inputfile%>...
Et j'ai trouvé bizarre problème - je obtenir ce quand je le lance avec le code ci-dessus:
Processing Template test.txt
erb):2:in `render': compile error (SyntaxError)
erb):2: syntax error, unexpected tSTRING_BEG, expecting $end
erbout.concat "\n"
^
from DBUser.rb:49:in `render'
from DBUser.rb:43:in `each'
from DBUser.rb:43:in `render'
from DBUser.rb:81
j'ai essayé ce qui suit, et j'ai contourné mon problème particulier - pas sûr si c'est la bonne réponse pour tout le monde ...
template = ERB.new File.new("path/to/template.erb").read
template.result(binding)