Wspólne stałe dla view i helpera

Witam ponownie,
Generuje sobie PDFy za pomocą prawnto. Napisałem sobie kilka metod w helperze i chciałbym współdzielnić kilka stałych (różne wymiary) między helperem i widokiem. I nie wiem jak.
Jasne, że mógłbym je ustawiać w konfiguracji, ale niezbyt mi się to uśmiecha. Z kolei stałe ustawione w helperze nie są widoczne dla widoku, a w widoku stałej ustawić nie mogę, bo dostaję compile error - dynamic constant assignment.
Jakiś pomysł? Thx z góry

Może jakiegoś singletona zrób, zainicjuj w initializers i się do niego odwołuj.

Możesz w helperze zrobić metody, które zwracają te stałe. Można by nawet pokusić się o jakieś rozwiązanie na meta poziomie, które działałby np. tak:

[code=ruby]class ApplicationHelper
constant :whatever, “whatever_value”

def whatever_function
WHATEVER + “…”
end

eventualnie

def whatever_function2
whatever + “…”
end
end[/code]
Pozostaje oczywiście pytanie na ile tego rodzaju rozwiązanie zrozumiałe byłoby dla pozostałych programistów. Dlatego myślę, że jednak STAŁA + metoda o tej samej nazwie jest bezpieczniejszym rozwiązaniem.

Dzięki za sugestie!
Wymyśliłem coś takiego:

  def self.included(base)
   (class << self; self; end).class_eval do
      MyHelper.constants.collect{|c| [c, c.downcase]}.each do |const, meth|
        define_method meth do 
          MyHelper.const_get(const)
        end
      end  
    end
  end

i jest super, tylko widok nie widzi nowych metod (self.included jest wywoływane na helperze już po jego wmixowaniu do widoku?). Z kolei define_method jest metodą prywatną więc nie mogę w ten sposób zdefiniować metod w widoku. A ręcznie bawić się z każdą stałą to chyba trochę nie DRY… Oczywiście mógłbym zrobić metody klasowe i za każdym razem wołać je przez MyHelper.jakas_stala ale czy nie da się krócej?

a method_missing nie pomoże?

Tak się chyba będzie musiało skończyć, ale to mało sexy rozwiązanie :frowning:

Ale czy musisz korzystać z “self.included”? Można by stworzyć metodę, powiedzmy constant_methods, którą byś wywoływał po ostatniej stałej:

[code=ruby]class A
B = “b”
def self.constant_methods
self.constants.map{|c| [c, c.downcase]}.
each{|c,m| define_method(m){ self.class.const_get©}}
end

constant_methods
end

A.new.b #=> “b”[/code]
Nie testowałem z widokiem, ale powinno działać, bo metody są zdefiniowane w momencie parsowania klasy.
Dodatkowo metodę “constant_methods” mógłbyś wyrzucić do osobnego modułu i wyczyścić definicję helpera.