0

我有一个类的哈希。

$sites = Hash["cat", Cat.new, "dog", Dog.new]

Dog有一个被调用的函数gmailOpen,它返回一个哈希值。

class Dog
    def gmailOpen(foo)
        puts "it totally reaches this point"
        return Hash["from",foo]
    end
end

我用一种奇怪的方式称呼它。哪个正常工作: result = eval("$sites['dog'].gmailOpen(1)")

但是当我作为 Sinatra 获取请求的结果调用它时,它会在返回语句中中断,WebBrick 告诉我您不能将数组转换为字符串:Internal Server Error: can't convert Array into String

class Controller < Sinatra::Base
  get '/hello/:id' do
    result = eval("$sites['dog'].gmailOpen(1)")
  end
end

如果我返回一个字符串或一个 int,它不会中断,尽管当我尝试返回一个数组时它会中断。

在 Sinatra 中,如果我不通过我的类哈希调用它或者我在没有eval().

d = Dog.new
result = eval("d.gmailOpen(1)")
result = $sites['dog'].gmailOpen(1)

为什么我不能返回哈希?

eval()注意:如果需要,我可以解释我的使用。现在,请假设这是绝对必要的。

4

2 回答 2

4

有几个东西可以用作Sinatra 路由的返回值。其中之一是

  • 一个响应给#each定块并只传递字符串的对象

Sinatra 通过查看对象是否响应来each识别此类返回类型,但不检查产生的对象的类型。

您正试图返回一个 Hash 对象,并且由于 Hash 响应each,Sinatra 假定它是这种类型的对象。但是,Hash#each不会产生字符串,而是数组(每个哈希条目的键和值的两个元素数组)。

接下来发生的事情实际上取决于您正在运行的服务器。使用 Thin,to_s在此数组上调用并将结果字符串作为页面正文返回。使用 Webrick(Ruby 附带的服务器,除非您安装了其他东西,否则将是默认服务器),结果是您看到的错误页面,并显示消息“无法将数组转换为字符串”(对于 Ruby 2.0,消息类似“没有将数组隐式转换为字符串”)。

解决方案是确保您从路线返回有效类型。请注意,如果需要,您可以使用body方法设置响应正文,然后如果需要,您可以返回nil以避免将设置的值替换为body.

于 2013-07-06T00:03:51.680 回答
1

所以事实证明你不能有一个不返回任何东西的 Sinatra 获取请求。因此,当我将方法更改为:

class Controller < Sinatra::Base
  get '/hello/:id' do
    result = eval("$sites['dog'].gmailOpen(1)")
    "I have to return something."
  end
end

我不再得到错误。感谢所有花时间研究这个问题的人,它鼓励我批判性地思考我的问题。

于 2013-07-05T05:25:08.370 回答