2013-04-21 1 views
0

Я новичок в Ruby and Rails. Я играю с Rack, пытаясь понять базовую концепцию головоломки Rails, следуя вместе с Робом Конери в его учебнике Tekpub/Rails 3 vid.Ruby on Rails/Rack Builder «Use» Method Wrong Number of Arguments

К сожалению, версия Rack, используемая в VID, стала длинной в зубе, и я думаю, что что-то изменилось между видео-релизом и теперь (как и некоторые вещи в 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) 

Это где первая в серии ошибок происходит (строка 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 я, очевидно, что-то неправильно передаю. К сожалению, я еще недостаточно знаю, чтобы понять, что я делаю неправильно. Я искал в Google и здесь, на SO, но я подозреваю, что у меня также недостаточно сильное понимание отношений Ruby/Rails/Rack, чтобы узнать, что спросить и получить разумно полезный результат (или, если я ЕСМЬ, то я этого еще не узнаю).

Кто-нибудь знает, что я делаю неправильно здесь?

UPDATE: Благодаря выбранному ответу, я понимаю, что это была опечатка. Следующая проблема - проблема преобразования массива в строку в том же коде, но будет опубликован как новый вопрос.

+1

Не могли бы вы показать всю трассировку стека? – rossta

+0

Я, хотя об этом, но подумал, что буду ждать, пока его спросят, как он был большой, и кто-то, возможно, сразу заметил проблему в моем рубиновом коде младшей лиги. Именно это и произошло! :-) – XIVSolutions

ответ

2

Это просто опечатка:

def intialize(app) 

должен быть

def initialize(app) 

(вы пропустили i).

Поскольку вы не предоставляете метод initialize, Ruby пытается использовать аргумент по умолчанию, без аргументов, но поскольку Rack передает аргумент (приложение), вы получаете ArgumentError.

+0

Ну, разве я не чувствую себя полным дураком! Однако создала новую проблему. В строке 'out + = response' появляется сообщение об ошибке« невозможно преобразовать Array в String ». Насколько я могу судить, переменная out представляет собой строку, а переменная ответа устанавливается на третий элемент в массиве, возвращаемом MyApp.call (env). Опять же, я думаю, что мне не хватает чего-то фундаментального. Можно задать новый вопрос, если вы считаете, что лучше. , , – XIVSolutions

+0

Позвольте мне сказать, что я полностью упал и, как будто начинаю все начинать. Который, я думаю, я в пути. :-) – XIVSolutions

 Смежные вопросы

  • Нет связанных вопросов^_^