2016-01-19 2 views
3

Я пытаюсь изучить Middlewares и практиковал, как его монтировать в приложении Rails. Я следовал railscastКак добавить промежуточное ПО в Rails 4.2 приложение

До сих пор я реализованы следующие шаги:

1) Создано новое приложение под названием Rails 4.2: Блог

2) Добавлен файл в папку с именем lib в response_timer.rb.

class ResponseTimer 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    [200, {"Content-Type" => "text/html"}, "Hello World"] 
    end 
end 

3) Добавлена ​​config.middleware.use "ResponseTimer" в application.rb.

config.middleware.use "ResponseTimer" 

Но, как я буду ударять команду rake middleware в терминале, он сообщает об ошибке:

rake aborted! 
NameError: uninitialized constant ResponseTimer 

Я попытался также добавить config.middleware.use "ResponseTimer" в development.rb но снова сталкивается с той же ошибки.

Что мне здесь не хватает?

Пожалуйста, помогите.

Реферировано статья: http://guides.rubyonrails.org/rails_on_rack.html

+0

попробуйте добавить свой код вместе с вопросом, который будет полезен для других, чтобы понять это лучше. – Abhinay

+0

Вы пытались найти файл в 'application.rb', ex:' require_relative '../ lib/response_timer'' – Abhinay

+0

Обновлен вопрос. Также этот ответ помог мне http://stackoverflow.com/a/24122424 –

ответ

4

Middleware должен иметь сопроводительный модуль/класс, и должен быть загружен в приложение, прежде чем он может ссылаться. Способ сделать это в Rails есть с autoloading (lib файлов не автоматически загружается по умолчанию):

#config/application.rb 
config.autoload_paths += Dir["#{config.root}/lib/**/"] 
config.middleware.use "ResponseTimer" 

выше должен работать для вас.

+1

'autoload_paths' не работает :(Если я делаю' rails server', то 'uninitialized constant Blog :: Application :: ResponseTimer (NameError)' И если я делаю 'rake middleware', тогда' NameError: uninitialized constant Blog :: Application: : ResponseTimer ' –

+0

Хм, а как насчет использования строки, как я отредактировал? –

+1

Спасибо :) Сейчас он работает. –

-2

Я последовал такой ответ: https://stackoverflow.com/a/24122424

Я попытался это раньше, но, возможно, прежде чем что-то пропустил.

В appliation.rb

require 'rails/all' 
require_relative '../lib/response_timer' 
module Blog 
class Application < Rails::Application 
    ... 
    config.middleware.use ResponseTimer 
end 
end 
+0

Вам не нужно явно указывать файл, это [antipattern] (https: // en. wikipedia.org/wiki/Anti-pattern). –

+0

@RichPeck Я уверен, что вы указали абсолютно правильно, но 'config.autoload_paths + = Dir [" # {config.root}/lib/**/"]' это не эта строка, делающая то же самое, кроме ее вызывая всю папку 'lib', где, как и в данном ответе, он просто вызывает один файл. не могли бы вы немного объяснить. – Abhinay

+0

Это автозагрузка папки lib, поэтому вам не нужно явно обращаться к файлам, которые вам нужны в 'application.rb'. –

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