2016-03-07 4 views
0

Предположим, у меня есть приложение Rails 4, которое отслеживает счетчики использования в части оборудования, поэтому у моего контроллера есть метод record_usage, который можно интерактивно вызывать из представления, чтобы немедленно получить и записать счетчик использования. Но я также хочу, чтобы запустить один и тот же метод периодически, так что я извлечение кода в автономном .rb файл и запустить его периодически через хроны сВозможно ли запустить Rails-контроллер с помощью runner?

rails r -e production record_usage.rb 

Моего вопросом: в интересах «СУХОЙ» могу ли я вызвать метод контроллера непосредственно из «record_usage.rb», вместо того, чтобы поддерживать отдельную копию кода record_usage в файле .rb?

+0

Похоже на нарушение «Единой ответственности» ... По какой-либо причине вы не можете извлечь этот метод в отдельный помощник/библиотеку/модель и использовать его оттуда? Вы не можете легко сделать это, не сталкиваясь с возможными проблемами, связанными с предположениями запроса (в зависимости от того, какие предположения фактически делает ваш контроллер). – PinnyM

+0

Возможно, вы захотите использовать что-то вроде [sidekiq] (https://github.com/mperham/sidekiq) или [delayed_job] (https://github.com/collectiveidea/delayed_job). Кроме того, вы можете обернуть свой код в классе; модель (без ActiveRecord) должна быть хорошей. – rdupz

ответ

2

Вы не вызываете методы контроллера извне, если не хотите семи лет неудачи и гнев богов MVC!

Открытый API-контроллер - это действия, которые отвечают на запросы HTTP. ВСЕ что-то должно быть частным методом.

Помните, что роль контроллера в MVC - это класс, который принимает запрос и возвращает ответ. Таким образом, это не место, чтобы засунуть все эти небольшие утилит.

Фактически, если вы хотите вызвать что-то извне из своего контроллера, что является очень сильным сигналом о том, что ваш контроллер fat и что вам нужно реорганизовать, перемещая бизнес-логику в слой модели.

АОЛИ с использованием объектов одинарных назначений, известные как объекты обслуживания является хорошим способом, чтобы очистить контроллеры, которые по совпадению одалживают очень хорошо задачи грабель и модульное тестирование:

module CleanupService 
    def self.call(foo) 
    foo.dot_the_is 
    foo.cross_the_ts 
    end 
end 

Не все в MVC должен быть моделью , просмотр или контроллер. Это просто позвоночник.

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