Стойка промежуточного уровня Hello World с рельсами 3: как обрабатывать тело всех запросов - PullRequest
5 голосов
/ 28 января 2011

Я хочу попробовать простое промежуточное ПО для стойки "hello world", но я, похоже, застрял. похоже, что основной синтаксис изменился, так как некоторые примеры используют этот код:

require 'rack/utils'

class FooBar

  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, body = @app.call(env)
         body.body << "\nHi from #{self.class}"
         [status, headers, body]
  end
end

выдает ошибку:

undefined method `<<' for #<ActionDispatch::Response:0x103f07c48>

, даже когда я смотрю на другие коды, я не могу заставить их работать с rails 3.0.3.

вот мои конкретные вопросы:

  • как мне получить простое промежуточное программное обеспечение стойки для запуска и изменения тела любого вывода из приложения rails?
  • куда мне поместить объявление Rails.application.config.middleware.use? (для этого я создал собственный инициализатор в config / initializers)

Большое спасибо заранее!

Ответы [ 2 ]

6 голосов
/ 03 апреля 2013

Rails 3.2.12 + :

предыдущий ответ не работает для Rails 3.2.12 +

Этот ответ:

# in config/application.rb
config.middleware.use 'FooBar'

# in config/initializers/foo_bar.rb
class FooBar
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, response = @app.call(env)
    response.body += "\nHi from #{self.class}"
    # response.body << "..." WILL NOT WORK
    [status, headers, response]
  end
end
6 голосов
/ 06 апреля 2011

Это должно делать то, что вы хотите:

# in config/application.rb
config.middleware.use 'FooBar'

# in config/initializers/foo_bar.rb
class FooBar
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, response = @app.call(env)
    [status, headers, response.body << "\nHi from #{self.class}"]
  end
end

Имейте в виду, что практически при каждом другом запросе (по крайней мере, на Rails 3.0.3) этот сбой происходит из-за другого промежуточного программного обеспечения (Rack :: Head), поскольку он отправляет пустой запрос, когда содержимое не изменяется. В этом примере мы зависим от возможности вызывать response.body, но на самом деле последний член массива может быть любым, что отвечает на .each.

Райан Бейтс довольно хорошо подходит к стойке:

http://asciicasts.com/episodes/151-rack-middleware

http://railscasts.com/episodes/151-rack-middleware

И официальный путеводитель по Rails тоже довольно хорош:

http://guides.rubyonrails.org/rails_on_rack.html

И, конечно, официальная спецификация стойки:

http://rack.rubyforge.org/doc/SPEC.html

...