Tworząc arkusze stylów dla projektów często zdarza się, że chcemy dodać styl specyficzny dla danego kontrolera. Przykładowo w kontrolerze wyświetlającym pewien specyficzny rodzaj danych, chcemy mieć inne formatowanie. W przypadku Railsów składać się to będzie na dwie części - najpierw w ApplicationControlerze dodamy sobie metodę która ustawiać nam będzie trzy zmienne dostępne zarówno w kontrolerach jak i widokach:
- @action_name - nazwa akcji
- @controller_name - nazwa kontrolera
- @module_name - nazwa modułu
Przy tym ostatnim (@module_name) należy pamiętać, że możemy mieć kilka "poziomów", np: Admin::Core::Logs, tak więc będziemy to trzymać w tablicy ([Admin, Core, Logs]). Przyjmiemy też konwencję, że nazwy będą przechowywane z małej litery.
def get_module_and_controller_name
my_class_name = self.class.name
@action_name = self.action_name
if my_class_name.index("::").nil? then
@module_name = nil
@controller_name = self.class.to_s.split('Controller').first.underlinize
else
@controller_name = self.class.to_s.split("::").last.split('Controller').first.underlinize
if (my_class_name.split("::").length > 2)
@module_name = my_class_name.split("::")
@module_name = @module_name[0, @module_name.length-1].collect{|m| m.underlinize}
else
@module_name = Array.new(1, my_class_name.split("::").first.underlinize)
end
end
end
Taką metodę ustawiamy jako before_filter.
Teraz jeszcze tylko helper do widoków:
def controller_stylesheet_link_tag(module_name, controller)
if module_name.class.to_s.downcase == 'array'
module_name = module_name.join('/')
end
ex = FileTest.exist?(File.join(Rails.root, 'public',
'stylesheets', module_name, "#{controller}.css"))
stylesheet_link_tag "#{module_name}/#{controller}" if ex
end
oraz wywołanie:
controller_stylesheet_link_tag(@module_name, @controller_name)
Warto wspomnieć, że powyższe rozwiązanie działa na 3.0.7. Dla 3.1.0 będzie troszkę inaczej, ale to pozostawiam wam :)
Wersja dla Padrino jest troszkę mniej "fajna" (aczk. wymaga before_filtre'a):
def controller_stylesheet_link_tag
path = request.path.split('/')
styles = ''
while path.count > 0
file = File.join(Padrino.root, 'app', 'stylesheets', 'controllers', path)+'.less'
if File.exists?(file)
styles += stylesheet_link_tag 'controllers'+path.join('/')
end
path.delete(path.last)
end
styles
end