2012-09-07 22 views
5

Powiel możliwe:
Append class if condition is true in Haml (with Rails)Neat sposobem na sprawdzenie, czy warunkowo dodać klasę w haml szablonu

używam szablonu, który pozwala, aby zaznaczyć pozycję listy jako current (używając class=current), podświetlając go na pasku nawigacji.

W haml ta wygląda następująco:

%li.current 
    Menu item A 
%li 
    Menu item B 
%li 
    Menu item C 

Mam ten kod w widoku Sinatra i chcesz programowo dodać class=current, w zależności od parametru do widzenia.

Jak zrobić to w najlepszy możliwy sposób?

Obecnie robię to tak:

- if section == "pages" 
    %li.current 
     %a{:href => "#pages"} Pages 
    - else 
    %li 
     %a{:href => "#pages"} Pages 

Który czuje się zbyt rozwlekły.

Odpowiedz

17

Można inline warunkowego w celu ustalenia, czy klasa jest potrzebna do% li

%li{ :class => ('current' if section == "pages") } 
    %a{ :href => "#pages" } Pages 
+0

Dzięki @mguymon, właśnie to, czego szukałem –

+0

w jaki sposób można użyć wielu Ifs dla różnych klas dla elementu z hamlem? – v3nt

+0

Najlepiej byłoby, gdyby nie naprzykrzać się wszystkim warunkom, będzie to brzydkie i trudne do odczytania. Zamiast tego zbuduj ciąg nazw klas przed i przekaż go do tagu haml. – mguymon

3

Jeśli section może być inny ciąg zamiast "pages", należy użyć coś jak mguymon odpowiedział. Ale jeśli to może być tylko nil, false lub "pages" ten kod jest bardziej zwięzły:

%li{ class:section && 'current' } 
    %a{ :href => "#pages" } Pages 

Ten stosować zasadę, że haml pominąć nil lub false atrybuty i każdy obiekt w Ruby jest evalueted jak true, z wyjątkiem: false i nil .

Tak więc, jeśli jest inny niż sectionnil lub false, następnie section && 'current' wyjścia 'current' else wyprowadza go false pominięciem atrybutu class.

+1

Dzięki @ waldyr-ar, jest to również przydatne :) –

+1

@ DanielMay Nie ma za co! Jesteśmy tu po to! :) –