How do I execute ruby template files (ERB) without a web server from command line?

前端 未结 7 1130
情深已故
情深已故 2020-12-13 09:27

I need ERB (Ruby\'s templating system) for templating of non-HTML files.
(Instead, I want to use it for source files such as .java, .cs, ...)

相关标签:
7条回答
  • 2020-12-13 09:28

    If you can switch ERB to Erubis, your problem solving is as simple as:

    require 'erubis'
    template = File.read("sample_file.erb")
    template = Erubis::Eruby.new(template)
    template.result(:your_variable => "sample")
    
    0 讨论(0)
  • 2020-12-13 09:28

    I tried to comment on this, but comments link not available.

    I'm using this:

    template = ERB.new File.new("path/to/template.erb").read, nil, "%"
    template.result(binding)
    

    From the posting above: and I found what I think it might be a problem:

    I'm creating DOS BATCH files like:

    %JAVA_HOME%\bin\jar -xvf <%=inputfile%>...
    

    And I found weird thing problem - I get this when I run with the code above:

    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
    

    I tried the following, and got round my particular problem - not sure if this is the right answer for everybody ...

    template = ERB.new File.new("path/to/template.erb").read
    template.result(binding)
    
    0 讨论(0)
  • 2020-12-13 09:29

    Another option would be to use ruby -e, since ERB itslef is so simple.

    Something like:

    ruby -rerb -e "puts ERB.new(File.read(<file name here>)).result"
    

    However, I assume you have a context you want to render the template in. How are you expecting to get that context? As an example, check out:

    ruby -rerb -e "hello = 'hello'; puts ERB.new('<%= hello %> world').result(binding)"
    

    which will print out "hello world", using the top-level, where you defined the hello variable, as the binding.

    0 讨论(0)
  • 2020-12-13 09:38

    Write a ruby script that does it. The API documentation is here: http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/

    For example:

    template = ERB.new File.read("path/to/template.erb"), nil, "%"
    template.result(binding)
    

    (Where binding is a binding with the @vars that the template needs.)

    0 讨论(0)
  • 2020-12-13 09:41

    This is a good basic article - http://rrn.dk/rubys-erb-templating-system And one more - http://www.stuartellis.eu/articles/erb/

    0 讨论(0)
  • 2020-12-13 09:44

    You should have everything you need in your ruby/bin directory. On my (WinXP, Ruby 1.8.6) system, I have 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 "%"
    

    so erb your_erb_file.erb should write the result to STDOUT.

    (EDIT: windows has erb.bat and just plain "erb". The .bat file is just a wrapper for erb, which I guess should make the same command work pretty much the same on any OS)

    See the prag prog book discussion (starts about half-way down the page).

    Note also that Jack Herrington wrote a whole book about code generation that uses Ruby/ERB.

    0 讨论(0)
提交回复
热议问题