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
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.