(红宝石)错误:"set_encoding":无法将 sinatra 文件中的字符串转换为哈希(base.rb,第 1760 行)



我正在尝试从github运行一个示例应用程序。他们的应用程序运行良好。这意味着我的设置是错误的,但我不知道是什么。这是我第一次尝试ruby。

我做了什么:
1-从github下载代码
2-制作了一个gemfile:

source "https://rubygems.org"
ruby "2.0.0"
gem "sinatra", "1.4.4"
gem "haml", "4.0.3"
gem "sass", "3.2.12"

3-运行捆绑包安装
4-当我运行我的.rb文件(在heroku或我的电脑上)时,我每次都会收到这个错误:

/Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1760:in `set_encoding': can't convert String to Hash (String#to_hash gives Symbol) (TypeError)
    from /Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1760:in `block in detect_rack_handler'
    from /Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1758:in `each'
    from /Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1758:in `detect_rack_handler'
    from /Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1420:in `run!'
    from /Library/Ruby/Gems/2.0.0/gems/sinatra-1.4.4/lib/sinatra/main.rb:25:in `block in <module:Sinatra>'


-->我应该发出信号,我试图运行的github repo是旧的(自2010年以来就没有碰过)

这似乎是所用gem"sinatra"中的一个错误。

尝试这样更改gemfile(不提供明确的版本号),以便应用程序安装最新版本的gem。

source "https://rubygems.org"
ruby "2.0.0"
gem "sinatra"
gem "haml"
gem "sass"

可能有一个更新版本的sinatra宝石。

好的。所以事实证明这不是我的安排。(我尝试使用2009年的gems和ruby版本,但它也没有让错误消失。)

我通过在脚本中逐渐注释来缩小范围(因为ruby不会在我自己的文件中给我一行,只在sinatra文件中,我一开始认为这不是因为我的代码)。

-->这是一行代码,现在我在脚本中注释了它,使错误永远消失,似乎没有负面副作用。(请参阅下面的代码)。

如果有人能简要评论这个方法(这是某种sinatra框架回调吗,用于错误处理对不存在的方法的调用?我认为这是因为我的文件中从未调用过它!)以及为什么它会导致问题中描述的错误,我会选择他们的答案,否则我会选择这个(我的)答案。(只要写下你知道或能找到的关于这种方法的任何东西,我就会选择你的答案,谢谢)。

def method_missing(methId)
  method_name=methId.id2name.intern
  if @lists.respond_to? method_name
    @lists.send(method_name).pick
  else
    # method_name # line that caused the error in the sinatra source files.
  end
end

========================================

下面是我自己对方法缺失的快速研究。。。尝试在这里学习一下ruby:

关于method_missing的一些信息:
http://www.alfajango.com/blog/method_missing-a-rubyists-beautiful-mistress/#/when-使用缺少的方法
http://rubylearning.com/blog/2010/10/07/do-you-know-rubys-chainsaw-method/

第二个链接是一个伟大的介绍。基本上,methodmissing是一种错误处理程序,用于调用不存在的方法。这是一个ruby语言的东西(当找不到方法时,它会调用methodmissing)。因此,它不与框架绑定,只与ruby绑定。

除了简单的错误处理之外,它的一个常见用法是能够根据(不存在的)方法名称定义操作(根据不存在的方法名称组成操作。

一种限制"你将要当场弥补行为的方法"池的方法是用正则表达式匹配if(或者在我们的例子中是预定义项目列表中的匹配)。如果不匹配,那么您可以自己抛出一个异常,或者返回查看调用代码中接下来会发生什么。

所以在我们的代码中:

if the method name doesnt exist, they check if it exists in a list and act accordingly (they return a list, picked among @lists).
but if it is not found in @lists … they return that very method name, a string, that we didnt have a match for. 

但现在的问题是:-->调用代码是如何处理该返回值的?(显然不太好,它似乎需要一个散列或数组,而不是方法名称字符串)处理"找不到与您不存在的方法匹配的方法"的一个安全方法是调用super,恢复调用代码的正常执行(根据第一个链接)。

因此,还有一个问题:返回方法名是个好主意吗?返回方法名称是否可行?还是它真的错了,超级(或者什么都不)应该放在它的位置?

…我的临时结论是-->有时不应该返回列表,其他时候则不应该返回字符串。因此,这将是一个明显的错误,令人惊讶的是,它从未造成问题,也从未在最初的回购中发现。。。

最新更新