2012-06-15 2 views
0

В моем файле Еврорадио, у меня есть следующий код в теге тела:Условное утверждение в «each ... do» в Ruby?

<% @tasks.each do |task| %> 
    <%= task.name %> 
<% end %> 

Это работает, но я только хочу, чтобы отобразить task.name если task.otherAttribute не равно -1.

По какой-то причине я не могу понять, как это сделать! Любые советы очень понравятся.

Заранее спасибо.

ответ

3

Попробуйте это:

<% @tasks.each do |task| %> 
    <%= task.name if task.otherAttribute != 1 %> 
<% end %> 

Или:

<% @tasks.each do |task| %> 
    <%= task.name unless task.otherAttribute == 1 %> 
<% end %> 

я представлю еще несколько вариантов для дальнейшего использования:

<% @tasks.each do |task| %> 
    <% if task.otherAttribute != 1 %> 
    <%= task.name %> 
    <% end %> 
<% end %> 

<% @tasks.each do |task| %> 
    <%= task.otherAttribute == 1 ? '' : task.name %> 
<% end %> 

Удачи!

+0

спасибо тонну, это имеет большой смысл. – tonic

0

Вы можете поместить условные обозначения в свой код ERB.

<%= task.name if task.otherAttribute != 1 %> 

Вы также можете выполнять более сложные задачи с более подробным синтаксисом. Это не обязательно в вашем случае, но вы можете также сделать более традиционным, если/иначе блоки, как так:

<% if task.otherAttribute != 1 %> 
    <%= task.name %> 
<% end %> 
3

Я предпочитаю использовать #select и #reject для этой идиомы, так как это в основном то, что вы делаете.

<%= @tasks.reject{|t| t.other_attribute == -1}.each do |task| %> 
    <%= task.name %> 
<% end %> 

Они приходят из модуля Enumerable, что большинство вещей с #each метода включают.

+0

Это было очень полезно и работало так, как мне было нужно! Почему вы используете «t» вместо «задачи»? Не ясно, на этот бит. – tonic

+0

@tonic, 'task' будет работать отлично. На мой взгляд, на самом деле плохой практикой является использование одноименных имен переменных, хотя, когда блок принимает только один аргумент и имеет одну строку логики, в любом случае я склонен это делать. Пойдите с вашим инстинктом и используйте 'task';) – d11wtq