gpt4 book ai didi

Ruby: erb throwing error "` result': can't convert String into Integer (TypeError)”

转载 作者:数据小太阳 更新时间:2023-10-29 07:37:07 24 4
gpt4 key购买 nike

快速背景:我正在设置一个快速而肮脏的模板方案,其中我所有的模板文件都命名为“*.erb”。填充数据驻留在 yaml 文件中。输出为模板名称减去“.erb”的文件。

我没有对 erb 做太多工作,我收到错误“`result':无法将字符串转换为整数(TypeError)”......这对我来说没有多大意义。

这是完成工作的类 (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

yaml 文件(test.yaml):

--- 
test_id: XXX123

模板文件(test.txt.erb):

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

导致整个困惑的代码(test.rb):

#! /usr/bin/ruby

require "generate_interface"

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

最后,输出和错误信息:

$ 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

我认为 _erbout.concat(( i['test_id'] ).to_s) 有问题,但是当我显式打印 ( i['test_id'] ).to_s 时,我得到的是 'XXX123'我期待。

最佳答案

(您粘贴的 generate_interface.rb 错过了最后的 end)

直接的问题是 Erb.initialize 的第二个参数是安全级别;第三个是修剪选项。您的修剪选项被解释为安全水平。

要解决这个问题,请更改

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

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

第二个问题是变量i 不会自动对您的模板代码可用。要解决这个问题,您需要传入一个绑定(bind),更改

  result = message.result

  result = message.result(binding)

在接下来的行中,将 message.result 更改为 result

关于Ruby: erb throwing error "` result': can't convert String into Integer (TypeError)”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4008732/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com