Czasami muszę dodać klasę do elementu html na podstawie warunku. Problem w tym, że nie mogę wymyślić, jak to zrobić w czysty sposób. Oto przykład rzeczy, których próbowałem:
<div <%= if @status = 'success'; "class='ok'"; end %>>
some message here
</div>
LUB
<% if @status == 'success' %>
<div class='success'>
<% else %>
<div>
<% end %>
some message here
</div>
Nie podoba mi się pierwsze podejście, ponieważ jest zatłoczone i trudne do odczytania. Nie podoba mi się drugie podejście, ponieważ zagnieżdżanie jest schrzanione. Byłoby miło umieścić to w modelu (coś w stylu @status.css_class
), ale to nie pasuje . Co robi większość ludzi?
źródło
Unikanie logiki w widokach
Problem z podejściem standardowym polega na tym, że wymaga ono logiki w postaci
if
instrukcji lub trójek w widoku. Jeśli masz wiele warunkowych klas CSS zmieszanych z klasami domyślnymi, musisz umieścić tę logikę w interpolacji ciągów lub tagu ERB.Oto zaktualizowane podejście, które pozwala uniknąć wprowadzania logiki do widoków:
class_string
metodaclass_string
Pomocnik bierze hash z par klucz / wartość złożonych z klasy CSS ciągów nazwy i wartości logicznych . Wynikiem metody jest ciąg klas, w których wartość logiczna jest oceniana jako true.Przykładowe użycie
Inne przypadki użycia
Ten helper może być używany w
ERB
tagach lub z pomocnikami Rails, takimi jaklink_to
.Klasy albo / albo
W przypadkach użycia, w których konieczna byłaby trójskładnik (np.
@success ? 'good' : 'bad'
), Przekaż tablicę, w której pierwszy element jest klasą dla,true
a drugi dlafalse
Zainspirowany React
Technika ta jest inspirowana dodatkiem o nazwie
classNames
(wcześniej znanym jakoclassSet
) zReact
front-endowego frameworka Facebooka .Używanie w projektach Railsowych
Obecnie
class_names
funkcja nie istnieje w Railsach, ale ten artykuł pokazuje, jak dodać lub zaimplementować ją w swoich projektach.źródło
Możesz także użyć pomocnika content_for, zwłaszcza jeśli DOM znajduje się w układzie i chcesz ustawić klasę css w zależności od częściowego załadowania.
Na układzie:
Częściowo:
To jest to.
źródło