2012-12-19 30 views
6

Więc widziałem wiele dyskusji na temat SO na temat używania erb w plikach CSS. Mogę poprosić ERB o przetwarzanie plików CSS za pomocą składni <% =%> i dodanie pliku .erb do pliku, ale naprawdę potrzebuję dostępu do zmiennych instancji w kontrolerze.Uzyskiwanie dostępu do zmiennych instancji kontrolera Rails w CSS

searches_controller.rb

def new 
    @search = Search.new 
    @school = School.find(params[:school]) 
end 

Co naprawdę chciałbym zrobić to:

searches.css.scss.erb

h1.logo { 
    color: <%= @school.primary_color %>; 
} 

ale ERB wygeneruje błąd, ponieważ @school jest zerowy. Czy jest jakiś sposób, aby wymagać od kontrolera dostępu do tych zmiennych instancji?

Jedyny inny sposób, w jaki mogę to zrobić, to osadzić go jako atrybut danych w widokach, a następnie użyć JS, aby zmienić go na interfejsie użytkownika. Wydaje mi się to potencjalnie lepsze, ponieważ plik CSS nie zmieni się i będzie musiał być ponownie za każdym razem, ale będzie również o wiele mniej elegancki.

Odpowiedz

9

Należy również wziąć pod uwagę, że w pre-kompilowane scenariuszu aktywów, CSS będzie prowadzony przez Koła łańcuchowe podczas kompilacji, więc chcesz skończyć z koloru statycznego (zakładając @school faktycznie instancja, która nie byłaby). Jest to niepożądane, ponieważ każda szkoła miałaby wtedy ten sam kolor (cokolwiek zdarzyło się podczas etapu kompilacji).

na zlecenie marki jak to pozwolimy naszym użytkownikom określić ich kolory i obejmują blok CSS w układzie:

:css 
    h1.logo { 
     color: <%= @school.primary_color %>; 
    } 

to nie jest idealne, ale jeśli masz mała liczba wydaje się dostosowywać działać całkiem dobrze.

+0

Dzięki. Miałem nadzieję, że poradzę sobie z tym poza poglądami, ale wydaje mi się, że to jest właśnie droga. – rurabe

+0

Czy możesz podać więcej szczegółów na temat dodawania bloku css do układu ...? Chciałbym zamienić obrazy na podstawie rozmiaru ekranu i potrzebuję sposobu, aby moje zapytania o media wyświetlały moje zmienne instancji. – brntsllvn

2

Wolałbym użyć @school.primary_color w twoim widoku. Powinno to zadziałać:

<h1 style="color:#{@school.primary_color}">@school.name</h1> 

Pamiętaj tylko, aby użyć interpunkcji podwójnego cudzysłowu.

+0

Próbuję dbać o zero tak wcześnie, jak to możliwe. Tak więc w tym przypadku widok nigdy nie byłby karmiony obiektem 'nil'. Ale jeśli to jest problem, to cały widok powinien być zawarty w sposób warunkowy. Nie dotyczy to tylko tego zastosowania. – mehulkar

+0

Jedynym problemem jest to, że jeśli używasz tego koloru w wielu miejscach w wielu widokach, otrzymujesz całkiem niezniszczalny kod. –

+0

To dobra uwaga. W zależności od liczby szkół dobrym rozwiązaniem może być zdefiniowanie stałych w plikach CSS dla każdej szkoły zamiast w bazie danych. – mehulkar