Rubin: erb Wurffehler „` Ergebnis ': Konvertierung String in Integer (Typeerror)“

StackOverflow https://stackoverflow.com/questions/4008732

  •  25-09-2019
  •  | 
  •  

Frage

Schnell Hintergrund: Ich gründe ein quick and dirty Templating Schema, wo alle meine Vorlagendateien genannt werden ‚* .erb‘. die Füllung in Daten befinden sich in einer YAML-Datei. Die Ausgabe erfolgt in Dateien mit dem Namen der Vorlage, minus ‚.erb‘.

Ich habe nicht viel Arbeit mit erb getan, und ich bin immer die Fehlermeldung „` Ergebnis ': Konvertierung String in Integer (Typeerror).“... das ist nicht viel Sinn für mich macht

Hier ist die Klasse, die die Arbeit macht (generate_interface.rb):

#! /usr/bin/ruby

require 'yaml'
require 'erb'

class GenerateInterface
  def initialize(yamlfile)
    @yamlfile = yamlfile
    @erbfiles = Dir.glob("*.erb")
  end

  def gobutton
    # i -- interface. kept short because it's used all over the place in the erb files.
    i = YAML.load_file( @yamlfile )
    puts( "i: #{i.inspect}" )
    puts( "i['test_id']: #{i['test_id'].inspect}" )
    puts( "( i['test_id'] ).to_s: #{( i['test_id'] ).to_s}" )
    @outfile=@erbfiles.map do
      |erbfile|
      puts( "erbfile: #{erbfile.inspect}" )
      outfile = erbfile.gsub(/\.erb$/,"")
      puts( "outfile: #{outfile.inspect}" )
      template = File.open( erbfile, 'r' ) { |f| f.read }
      puts( "template: #{template.inspect}" )
      message = ERB.new(template, "%<>" )
      puts( "message: #{message.inspect}" )
      result=message.result
      puts( "result: #{result.inspect}" )
      File.open(outfile, 'w' ) { |f| f.write( message.result) }
    end
  end
end

Die YAML-Datei (test.yaml):

--- 
test_id: XXX123

Die Vorlagendatei (test.txt.erb):

Line 1
Line 2 test_id: <%= i['test_id'] %>
Line 3

Der Code, der treibt den ganzen Schlamassel (test.rb):

#! /usr/bin/ruby

require "generate_interface"

test_interface = GenerateInterface.new( "test.yaml" )
test_interface.gobutton

Und schließlich die Ausgabe und Fehlermeldungen:

$ ruby -d test.rb
Exception `NoMethodError' at /usr/lib/ruby/1.8/rational.rb:78 - undefined method `gcd' for Rational(1, 2):Rational
i: {"test_id"=>XXX123}
i['test_id']: XXX123
( i['test_id'] ).to_s: XXX123
erbfile: "test.txt.erb"
outfile: "test.txt"
template: "Line 1\nLine 2 test_id: <%= i['test_id'] %>\nLine 3\n"
message: #<ERB:0xb74ac150 @src="_erbout = ''; _erbout.concat \"Line 1\\nLine 2 test_id: \"\n; _erbout.concat(( i['test_id'] ).to_s); _erbout.concat \"\\nLine 3\\n\"\n\n; _erbout", @safe_level="%<>", @filename=nil>
Exception `TypeError' at /usr/lib/ruby/1.8/erb.rb:715 - can't convert String into Integer
/usr/lib/ruby/1.8/erb.rb:715:in `result': can't convert String into Integer (TypeError)
    from /usr/lib/ruby/1.8/erb.rb:714:in `call'
    from /usr/lib/ruby/1.8/erb.rb:714:in `result'
    from ./generate_interface.rb:26:in `gobutton'
    from ./generate_interface.rb:17:in `map'
    from ./generate_interface.rb:17:in `gobutton'
    from test.rb:6

ich dachte, dass etwas nicht in Ordnung war mit _erbout.concat ((i [ 'test_id']) .to_s), aber wenn ich drucken ausdrücklich (i [ 'test_id']) .to_s I 'XXX123' bekommen, das, was ich gehe davon aus.

War es hilfreich?

Lösung

(Ihre Paste von generate_interface.rb die endgültige end verpasst)

Das unmittelbare Problem ist, dass das zweite Argument Erb.initialize die sichere Ebene ist; die dritte die Ausstattungsvarianten zu sein. Ihre Ausstattungsvarianten als ein sicheres Niveau interpretiert werden.

Um das zu beheben, ändern

  message = ERB.new(template, "%<>" )

  message = ERB.new(template, nil, "%<>" )

Das zweite Problem ist, dass variable i auf Ihren Template-Code nicht automatisch zur Verfügung steht. Um dies zu beheben, müssen Sie in einer Bindung zu ändern

passieren
  result = message.result

  result = message.result(binding)

In der Zeile folgende Änderung message.result zu result

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top