Gdzie dawać bibliotekę pomocniczych funkcji?

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?

Możesz otworzyć klasę Time:

class Time 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 [month, year] end end
Następnie w np. kontrolerze:

Time.previous_month_year

RoR ma odpowiednie metody wbudowane:

[code]>> 1.month.ago(Time.mktime(2007,01,12)).year
=> 2006

1.month.ago(Time.mktime(2007,01,12)).month
=> 12
1.month.ago.year
=> 2007
1.month.ago.month
=> 1[/code]

Ja bym wstawił plik z modułem (już bez klasy, tylko odpowiednie metody) do katalogu “lib”, a następnie napisał:

[code]class ApplicationController < ActiveRecord::Base
include MyHelperLibrary

end[/code]
w application.rb

Wszystko powinno działać, jeżeli plik nazywa się “my_helper_library.rb”