2013-04-21 73 views
0

我是Ruby和Rails的新手。我正在和Rack一起玩,试图获得对这个Rails难题的基本理解,以及Rob Conery在他的Tekpub/Rails 3 tutorial vid中。Ruby on Rails/Rack Builder“使用”方法参数错误数量

不幸的是,在vid中使用的Rack版本已经变得漫长,我认为在视频发布和现在之间已经发生了一些变化(比如Ruby在1.8.x和1.9.x之间) 。更不幸的是,我还不太了解Ruby或Rack知道如何找出需要改变的地方。视频中使用的机架版本是1.1。我机器上的版本是1.4.5。

傻示例代码:

class EnvironmentOutput 

    def intialize(app) 
    @app = app 
    end 

    def call(env) 
    out = "" 

    unless(@app.nil?) 
     response = @app.call(env)[1] 
     out+=response 
    end 

    env.keys.each {|key| out+="<li>#{key}=#{env[key]}"} 
    ["200", {"Content-Type" => "text/html"}, [out]] 
    end 

end 


class MyApp 
    def call(env) 
    ["200", {"Content-Type" => "text/html"}, ["<h1>Hello There</h1>"]]  
    end 
end 

# My understanding is that this should work: 
use EnvironmentOutput 
run MyApp.new 

当运行此,我得到以下:

ArgumentError: wrong number of arguments(1 for 0) 

这是在一系列的错误的第一次出现(线82在机架Builder类):

def use(middleware, *args, &block) 
    if @map 
    mapping, @map = @map, nil 
    @use << proc { |app| generate_map app, mapping } 
    end 
    # error occurs HERE: 
    @use << proc { |app| middleware.new(app, *args, &block) } 
end 

O很显然,我错误地传递了一些信息。可悲的是,我还不知道自己做错了什么。我已经在谷歌和这里搜索了,但是我怀疑我对Ruby/Rails/Rack关系还没有足够的把握来知道该问什么,并得到一个合理有用的结果(或者,如果我是AM,那么我还没有认出它)。

有没有人知道我在做什么错在这里?

更新:由于选定的答案,我意识到这是一个错字。下一个问题是相同代码中的数组到字符串转换问题,但会作为新问题发布。

+1

你能展示整个堆栈跟踪吗? – rossta 2013-04-22 01:46:48

+0

我虽然对此有所了解,但我认为我会一直等到被问到,因为它很大,并且有人可能立即注意到我的青年联盟Ruby代码中的问题。这正是发生的事情! :-) – XIVSolutions 2013-04-22 02:35:52

回答

2

这只是一个错字:

def intialize(app) 

应该

def initialize(app) 

(你已经错过了一个i)。

由于您没有提供initialize方法,因此Ruby会尝试使用默认的无参数方法,但由于Rack传递参数(应用程序),您将获得ArgumentError

+0

嗯,我不觉得完全的傻瓜!但是,创造了一个新问题。在'out + = response'这一行,它给出了一个错误“无法将数组转换为字符串”。据我所知,变量out是一个字符串,响应变量设置为由MyApp.call(env)返回的数组中的第三个元素。再次,我想我错过了一些基本的东西。如果您认为最好,可以发布为新问题。 。 。 – XIVSolutions 2013-04-22 02:30:41

+0

请允许我说我完全失去了智力,就像我从头开始一样。我猜,我在某种程度上。 :-) – XIVSolutions 2013-04-22 02:34:04