2010-10-01 11 views
17

Próbuję zapisać ten html w Haml, aby dodać tag id, jeśli element jest aktualny. To jest do ustawienia podświetlania jquery.Warunkowo ustawiony identyfikator elementu HTML z HAML

<% if line_item == @current_item %> 
<tr class="line_item id="current_item"> 
<% else %> 
<tr class="line_item"> 
<% end %> 
    <td><%= line_item.quantity %>&times;</td> 
    <td><%= line_item.product.title %></td> 
    <td class="item_price"><%= number_to_currency(line_item.total_price) %></td> 
</tr> 

Bo nie chce napisać metodę pomocnika, mam zatrzymany if wewnątrz tagu:

%tr.line_item{ :id => (line_item == @current_item ? '' : 'current_item') } 
%td 
    = line_item.quantity 
%td 
    \x #{line_item.product.title} 
%td.item_price 
    = number_to_currency(line_item.total_price) 
%td.item_remove 
    = button_to 'Remove', line_item, :method => :delete 

Jednak to id tag „current_item” wciska ze wszystkimi przedmioty, a nie tylko bieżący. Powoduje to, że javascript podświetla wszystko lub błędny wpis. Myśli o tym, jak zmusić Hamla do współpracy?

Odpowiedz

32

Ehm panie, twój stan jest źle :-)

Należy

line_item == @current_item ? "current_item" : "" 

Jest rzeczą, która nie dość - skończyć z id="" dla pozostałych elementów. Ale jest na to proste lekarstwo:

%tr.lineitem{ :id => (line_item == @current_item ? "current_item" : nil)} 

Po powrocie nil wartość atrybutu haml będzie go ignorować i nie pojawi się na wyjściu.

+0

Dzięki! Chciałbym, żeby to było czystsze. – ScotterC

+0

To właśnie "" sprawiło, że poczułem się źle! :-) –

+0

Możliwość użycia zera do "zignorowania" atrybutu w HAML to świetna wskazówka - dziękuję za wskazanie tego! – jpwynn

5

To działa również jako alternatywa dla pierwszego rozwiązania w przyjętym odpowiedź

= f.input_field :hello, disabled: (true unless SOME_CONDITION_HERE) 
+0

Jest to szczególnie przydatne w przypadku atrybutów boolowskich (takich jak wyłączone). –

0

Biorąc @ odpowiedź vladCovaliov w kontekście pytania:

%tr.line_item{ id: (@current_item unless @current_item != line_item) }