2012-12-20 11 views
16

chcę przypisać klasę css do strony HTML na podstawie warunku w slim-langslim-lang if-else kod zagnieżdżony

robie to następujące

- if current_user 
    .title 
- else 
    .title_else 

Teraz jak mogę napisać kod HTML, który powinien być zagnieżdżony w jednej z powyższych klas? Czy muszę napisać kod HTML w stanie warunkowym if i else?

Powodem jest to, że kod HTML, który powinien zostać zagnieżdżony w jednej z powyższych klas, powinien być dalej skierowany w prawo. Ale jeśli mam zamiar to dalej, to jest to w ramach innego warunku. Jak shoule podchodzę do tego teraz?

Odpowiedz

28

Oto jeden liner:

.thing class=(current_user ? 'large-menu' : 'medium-menu') 
    h4 Same content, different class 
+3

Bardzo ładne. Interpolacja nie jest potrzebna. '.thing class = (prawda?" duże menu ":" średnie menu ")' – obfk

2

1) Tak, musisz napisać HTML do obu utworzonych elementów div, ponieważ chcesz, aby był inny. Jeśli nie chcesz, aby było inaczej, nie byłoby potrzeby, aby oświadczenie if!

2) Nie bardzo rozumiem twój punkt widzenia, ale ten kod działa perfekcyjnie ze mną:

- if true 
    .title 
    h4 True is true! 
- else 
    .title_else 
    h4 True is not true! 

Kod ten pokazał div z klasą .title i h4 z tekstem True is true! wewnątrz niego .

EDIT: Dobra, teraz rozumiem co masz na myśli! To jest możliwe, aby zrobić coś takiego, ponieważ nie wyrenderuje h4!

- if true 
    .title 
- else 
    .title_else 

    h4 Same content, different class 

Polecam Ci napisać pomocnika, który pozwala na renderowanie częściowe, a następnie po prostu wyrenderować częściowe z wewnątrz obu warunków. Oznacza to, że musisz napisać tylko jeden fragment i wywołać go dwa razy.

- if true 
    .title 
    = render 'footer' 
- else 
    .title_else 
    = render 'footer' 
+0

mój pytanie mam ten sam blok kodu dla obu, jeśli blok i blok inny. Chcę tylko zastosować inną klasę na podstawie warunku. Czy istnieje lepszy sposób na uniknięcie powtórzenia kodu? – nik7

15

Skoro tylko przełączanie między dwoma atrybutami Tiago Franco's answer jest z pewnością wystarczający do swoich celów. Istnieje jednak inny sposób, który przydaje się.

Możesz użyć capture, aby renderować HTML do zmiennej lokalnej, a następnie osadzać tę zawartość w dowolnej strukturze kontrolnej, którą lubisz. Tak więc, jeśli treść opakowanie było nieco bardziej skomplikowane, to by to zrobić:

- shared_content = capture do 
    div This is displayed regardless of the wrapper 
- if current_user 
    | You're logged in! 
    .title 
    = shared_content 
- else 
    | You're not logged in! 
    .title_else 
    = shared_content 

będę często używać tego zawinąć treści w linku jeśli jest dostępny URL:

- image = capture do 
    img src=image_url 
- if url.blank? 
    = image 
- else 
    a href=url = image