Chcę zebrać w aplikacji biblioteczkę funkcji przydatnych w wielu miejscach kodu kontrolera lub modelu (ale nie kwalifikują się jako metody do konkretnych modeli, bo są wspólne dla wielu i mają charakter durno-pomocniczy). Jak zrobić to the Rails-way? Helpery służą jako pomoce dla widoków, ale użycie zawartych tam funkcji w kontrolerze lub modelu jest upierdliwe, bo wywołanie wygląda jak litania i psuje się uporządkowanie kodu.
Przykład: funkcja previous_month_year, która zwraca [miesiąc, rok] który był w poprzednim miesiącu (czyli ma w sobie inteligencję sprawdzającą że poprzednikiem stycznia jest grudzień, ale zeszłego roku). Teraz wygląda to tak, że w /helpers/application_helper.rb mam założoną sztuczną klasę z metodą (bez klasy się nie daje tego wywołać):
module ApplicationHelper
...
class Global
def self.previous_month_year
month = Time.now.month - 1
year = Time.now.year
if month == 0 # poprzednik stycznia, czyli ma być grudzień i cofamy rok
month = 12
year -= 1
end
return [month, year]
end
end
...
i z modelu wywołuję to tak (okropnie!):
previous = ::ApplicationHelper::Global.previous_month_year
tasks = Task.find(:all, :conditions => ["project_id = ? and MONTH(created_on) = ? and YEAR(created_on) = ?", self.id, previous[0], previous[1]])
Czuję wewnętrze fuj tego kodu. Jak wy rozwiązujecie takie dylematy?