为什么Sinatra不能正常工作?

时间:2011-04-30 17:48:02

标签: ruby-on-rails ruby amazon-ec2 sinatra

我最近尝试设置Amazon EC2实例来运行Rails和Sinatra应用程序。问题 - Sinatra将无法启动。当我尝试运行.rb文件时,会抛出类似这样的内容:

$ ruby hello.rb 
/usr/local/rvm/gems/ruby-1.8.7-p334/gems/sinatra-1.2.5/lib/sinatra/base.rb:1144:in `define_method': tried to create Proc object without a block (ArgumentError)
        from /usr/local/rvm/gems/ruby-1.8.7-p334/gems/sinatra-1.2.5/lib/sinatra/base.rb:1144:in `compile!'
        from /usr/local/rvm/gems/ruby-1.8.7-p334/gems/sinatra-1.2.5/lib/sinatra/base.rb:1129:in `route'
        from /usr/local/rvm/gems/ruby-1.8.7-p334/gems/sinatra-1.2.5/lib/sinatra/base.rb:1111:in `get'
        from /usr/local/rvm/gems/ruby-1.8.7-p334/gems/sinatra-1.2.5/lib/sinatra/base.rb:1474:in `send'
        from /usr/local/rvm/gems/ruby-1.8.7-p334/gems/sinatra-1.2.5/lib/sinatra/base.rb:1474:in `get'
        from hello.rb:4

现在,我最初认为这是EC2特有的。所以我在我的Mac上设置了RVM并尝试了同样的结果。然后我认为它可能是正在使用的Ruby的特定版本(1.9.2)。事实并非如此 - 即使1.8.7也存在问题。现在,我完全迷失了。以下是我的EC2实例上当前安装的gem列表:

$ gem list

*** LOCAL GEMS ***

abstract (1.0.0)
actionmailer (3.0.7)
actionpack (3.0.7)
activemodel (3.0.7)
activerecord (3.0.7)
activeresource (3.0.7)
activesupport (3.0.7)
arel (2.0.9)
builder (2.1.2)
bundler (1.0.12)
coderay (0.9.7)
erubis (2.6.6)
i18n (0.5.0)
mail (2.2.19)
method_source (0.4.1)
mime-types (1.16)
polyglot (0.3.1)
pry (0.8.3)
rack (1.2.2)
rack-mount (0.6.14)
rack-test (0.5.7)
rails (3.0.7)
railties (3.0.7)
rainbow (1.1.1)
rake (0.8.7)
ruby_parser (2.0.6)
sexp_processor (3.0.5)
sinatra (1.2.5)
slop (1.5.3)
thor (0.14.6)
tilt (1.3)
treetop (1.4.9)
tzinfo (0.3.27)

请让我知道你的想法 - 感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

看起来这是sinatra中的一个错误:https://github.com/sinatra/sinatra/issues/258

作为解决方法,请在新的rvm gemset中尝试以前版本的sinatra:gem install sinatra -v 1.2.3,或者在gem 'sinatra' '=1.2.3'行之前使用require sinatra在文件中指定所需的版本

更新

Sinatra 1.2.5(故障版本)has been yanked and a new version released。任何收到此错误的人现在都可以执行gem update sinatra并使用更新后的gem。

答案 1 :(得分:0)

这不是RVM问题,因为我在Sinatra中使用它。

这是一些测试代码:

#!/usr/bin/env ruby

require 'sinatra'

get '/hi' do
  "Hello World! #{ `rvm -v` }"
end

将其保存为类似test.rb的内容并执行chmod +x test.rb以使其可执行。使用which ruby确认您在RVM的控制下运行Ruby,该~/.rvm路径将返回./test.rb路径中的路径。使用>> == Sinatra/1.2.3 has taken the stage on 4567 for development with backup from WEBrick >> [2011-04-30 14:49:56] INFO WEBrick 1.3.1 >> [2011-04-30 14:49:56] INFO ruby 1.9.2 (2011-02-18) [x86_64-darwin10.6.0] >> [2011-04-30 14:49:56] INFO WEBrick::HTTPServer#start: pid=3387 port=4567 >> 127.0.0.1 - - [30/Apr/2011 14:50:02] "GET /hi HTTP/1.1" 200 103 0.2499 >> localhost - - [30/Apr/2011:14:50:01 MST] "GET /hi HTTP/1.1" 200 103 >> - -> /hi >> 127.0.0.1 - - [30/Apr/2011 14:50:02] "GET /favicon.ico HTTP/1.1" 404 441 0.0008 >> localhost - - [30/Apr/2011:14:50:02 MST] "GET /favicon.ico HTTP/1.1" 404 441 >> http://localhost:4567/hi -> /favicon.ico >> >> == Sinatra has ended his set (crowd applauds) >> [2011-04-30 14:50:11] INFO going to shutdown ... >> [2011-04-30 14:50:11] INFO WEBrick::HTTPServer#start done. 运行代码,您的RVM控制的Ruby将启动它。

控制台出局:

Hello World! rvm 1.6.5 by Wayne E. Seguin (wayneeseguin@gmail.com) [https://rvm.beginrescueend.com/]

我在浏览器中看到的内容:

get '/hi' do
  "<pre>#{ `which ruby` }</pre>"
end

将其更改为:

/Users/greg/.rvm/rubies/ruby-1.9.2-p180/bin/ruby

在我的浏览器中显示:

rvm get head
rvm reload

所以,基本上,我已经在我的系统上运行RVM,而Ruby 1.9.2是当前的Ruby。尝试使用该代码,运行它并查看是否在浏览器中输出。

另请查看您的RVM是否是最新的。它上周涨至1.6.5。如果您目前没有使用:

#!/usr/bin/env ruby

require 'sinatra'

get '/hi' do
  "Running using: #{RUBY_VERSION}<br>Ruby in path found at: #{ `which ruby` }"
end

编辑:

进一步测试以显示正在运行的Ruby:将代码更改为:

Running using: 1.9.2
Ruby in path found at: /Users/greg/.rvm/rubies/ruby-1.9.2-p180/bin/ruby

然后运行它。如果您的解释器正在运行系统安装的Ruby on MacOS或者通过apt-get运行Ruby的默认安装,那么您将使用1.8.7。我明白了:

{{1}}