Automatyczne includowanie styli i JS przy wywołaniu funkcji w partialu

Witam,

chciałbym uzyskać taki efekt, żeby zdefiniować w helperze taką funkcję, która doda do sekcji (znajdującej się w layoucie) odpowiednie tagi do dołączania CSS i JS.

Idea jest taka, że mam helpery z funkcjami które wykorzystuję do generowania interfejsu mojej aplikacji. Część z nich do działania kontrolek potrzebuje zewnętrzne, dodatkowe CSS i JS. Chodzi o to, że jeśli wywołuję potem np. w widoku

<%= render :partial => "kontrolka_drzewka_dla_listy_uzytkownikow" %>

a potem w partialu _kontrolka_drzewka_dla_listy_uzytkownikow.rhtml mam

<%= kontrolka_drzewka("uzyszkodnik", "parametr1", "parametr2") %>

to aby w ciele funkcji kontrolka_drzewka był taki kod, który zmodyfikuje w sposób opisany powyżej - tak, żebym nie musiał już o tym pamiętać w widoku, aby dołączać za każdym razem te style i JS, a żeby też ich nie dołączać globalnie do layoutu - bo po co mają się ładować, gdy nie są potrzebne?

Z góry dzięki za wskazówki, jak to zrobić.

Najprościej to chyba umieścić w head jakąś zmienną instancyjną, w którą będziesz pakował te .css i .js.

Jak dokładnie to zrobisz - to już Twoja decyzja. Osobiście bym to chyba (jest 4 rano, nie bijcie) załatwił tablicą hashy, która w headzie byłaby przekazana do własnego helpera. Ów helper by sobie iterował po parametrze i wywoływał już odpowiednie railsowe tagi (javascript_include_tag itd.)

No ok, ale to nie jest tak, że ten mój partial, który potem docelowo będzie gdzieś tam w yield i przy Twoim założeniu dopisze coś do tej tablicy hashy, jest wywoływany już PO tym jak ruby przerobi layout (a przynajmniej ?)

Najlepiej zrobić to za pomocą nazwanego yield’a i content_for, tzn:

w layoucie masz:

[code=html]

<%= yield :head %> ... [/code] a w templejcie/partialu/helperze masz:

<% content_for :head do -%> <%= javascript_include_tag "my_js", "another_lib" %> <% end -%>
Nie trzeba tworzyć żadnych zmiennych instancji, ktoś już o tym pomyślał dlatego powstało content_for. Oczywiście content_for możesz używać do czego tylko Ci się podoba, nie tylko inkludowania js/css.

Genialne, właśnie o coś takiego mi chodziło :slight_smile: Dzięki!