Отказ от ответственности: Хотя я спрашиваю в контексте приложения направляющих, я не говорю о помощниках направляющих (т.е. помощниках представления)
Скажем, у меня есть вспомогательный метод / функция:
def dispatch_job(job = {})
#Do something
end
Теперь я хочу использовать это от нескольких различных мест (главным образом контроллеры, но также и несколько рабочих BackgrounDRb)
Что предпочтительный путь состоит в том, чтобы сделать это?
Я могу думать о двух возможностях:
1. Используйте класс и сделайте помощника статическим методом:
class MyHelper
def self.dispatch_job(job = {})
end
end
class MyWorker
def run
MyHelper.dispatch_job(...)
end
end
2. Используйте модуль и включайте метод в любой класс, мне нужна эта функциональность
module MyHelper
def self.dispatch_job(job = {})
end
end
class MyWorker
include MyHelper
def run
dispatch_job(...)
end
end
3. Другие возможности я еще не знаю
...
Первый более подобен Java, но я не уверен, является ли второй действительно соответствующим использованием модулей Ruby.
Я бы выбрал модульный подход. Я предпочитаю его из-за его гибкости и того, насколько хорошо он позволяет вам организовать ваш код. Я полагаю, вы можете возразить, что это просто еще одна форма миксинов. Я всегда думаю о миксинах как о прямом расширении определенного класса
class Foo
def hello
'Hello'
end
end
class Foo
def allo
'Allo?'
end
end
f = Foo.new
f.hello => 'Hello'
f.allo => 'Allo?'
Это всегда кажется очень специфическим, тогда как модульный подход может расширить любой класс, в который вы его включили.
Peer
Если вы собираетесь использовать это в своих контроллерах и каком-либо другом коде, вы можете создать миксин и добавить его в свой контроллер приложения, из которого другие контроллеры получить из, таким образом, вы можете иметь его в своих контроллерах, затем вы можете добавить модуль к другим внешним классам.