2013-04-21 35 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

相關問題