Инициализаторы Rails 3, которые работают только на `rails server`, а не на` rails generate` и т. Д. - PullRequest
9 голосов
/ 28 декабря 2011

У меня есть относительно небольшой фрагмент кода инициализатора, который я хочу запускать всякий раз, когда запускается rails server, но не когда я запускаю rails generate, rails console или любую другую команду rails (включая задачи rake, требующие задачи среды) , Этот фрагмент кода предварительно заполняет некоторые кэши и является относительно дорогим, поэтому я действительно не хочу, чтобы он работал на чем-либо, кроме rails s

Неудовлетворительные решения:

Foreman et al. будет означать, что он будет запущен в другом процессе, который (а) перегружен для этого небольшого фрагмента кода, (б) требует межпроцессного взаимодействия вместо простого подхода в памяти, предоставляемого инициализатором.

На сервере я решил эту проблему, настроив пассажиров для передачи специальной переменной среды в rails, сообщая, что она работает в контексте сервера. Однако я хотел бы, если это возможно, работать "из коробки" на всех машинах разработчика, не прибегая к тому, чтобы не забыть запустить rails server таким способом, который также предоставит эту переменную среды (т.е. 1013 *).

Этот вопрос всегда задавался ранее относительно запуска инициализатора при работе в rails server, а не в rake. Однако я хочу, чтобы он запускался только при инициализации сервера - исправление для rake прекрасно, но не является исчерпывающим.

Ответы [ 2 ]

4 голосов
/ 28 декабря 2011

Можете ли вы сделать что-то вроде переопределения Rails::Server#initialize, чтобы он вызывал ваш код инициализации в инициализаторе?

Или, проще, просто введите свой код в script/rails, так как он будет запускаться каждый раз, когда вы запускаете rails server, вы можете легко поиграть с ARGV или ENV там.

0 голосов
/ 17 мая 2017

Вот один из способов:

# config/initializers/my_init.rb
Rails.application.config.after_initialize do
    # tweak this as required...
    unless defined?(::Rails::Generators) || defined?(::Rails::Console) || File.basename($0) =='rake'
        Rails.logger.info("Doing some init")
        # ...
    end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...