我是Ruby和Rails的新手。我正在玩Rack,试图在他的Tekpub / Rails 3教程视频中跟随Rob Conery一起基本理解Rails拼图的这个问题。
不幸的是,在vid中使用的Rack的版本已经变得很长,我认为在视频版本和现在之间发生了一些变化(在Ruby中有一些介于1.8.x和1.9.x之间)。更不幸的是,我还不太了解Ruby或Rack,知道如何弄清楚我需要做些什么。视频中使用的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)
这是发生一系列错误中的第一个错误(机架Builder
类中的第82行):
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
显然,我传递的内容不正确。可悲的是,我还不知道该怎么做我做错了。我在Google上搜索过,但是我怀疑我对Ruby / Rails / Rack关系的掌握程度还不够,知道要问什么并得到一个合理有用的结果(或者,如果我,然后我还没认识到它)。
有谁知道我在这里做错了什么?
更新:感谢选定的答案,我意识到这是一个错字。下一个问题是同一代码中的数组到字符串转换问题,但将作为新问题发布。
答案 0 :(得分:3)
这只是一个错字:
def intialize(app)
应该是
def initialize(app)
(你错过了i
)。
由于你没有提供initialize
方法,Ruby尝试使用默认的无参数方法,但是由于Rack传递了一个参数(应用程序),你得到了ArgumentError
。