Корпус переключателя Rails в виде - PullRequest
24 голосов
/ 07 марта 2012

Я хочу написать случай переключения на мой взгляд:

<% @prods.each_with_index do |prod, index|%>
    <% case index %>
        <% when 0 %><%= image_tag("#{prod.img}", :id => "one") %>
        <% when 1 %><%=  image_tag("#{prod.img}", :id => "two") %>
        <% when 2 %><%= image_tag("#{prod.img}", :id => "three") %>
    <% end %>
<% end %>

Но это не работает.Нужно ли добавлять <% end %> где-то в каждой строке?Есть идеи ?Спасибо!

Ответы [ 6 ]

58 голосов
/ 07 марта 2012

Вы должны потянуть свой первый when в тот же блок, что и case

<% @prods.each_with_index do |prod, index|%>
  <% case index 
     when 0 %><%= image_tag prod.img, :id => "one") %>
  <% when 1 %><%= image_tag prod.img, :id => "two") %>
  <% when 2 %><%= image_tag prod.img, :id => "three") %>
  <% end %>
<% end %>
19 голосов
/ 07 марта 2012

Не используйте много логики в своих взглядах.

я бы добавил помощника

def humanize_number(number)
    humanized_numbers = {"0" => "zero", "1" => "one"}
    humanized_numbers[number.to_s]
end

, чем вы можете позвонить из вида с помощью

<%= image_tag("#{prod.img}", :id => humanized_number(index)) %>
4 голосов
/ 07 марта 2012

Во-первых, вы должны подумать об абстрагировании этой функции во вспомогательный метод, чтобы избежать загромождения ваших представлений логикой.

Во-вторых, операторы case немного сложны для использования в ERB из-за способа, которым erb анализирует код. Вместо этого попробуйте (не проверено, поскольку у меня нет рубина под рукой):

<% @prods.each_with_index do |prod, index|%>
  <% case index
    when 0 %>
      <%= image_tag("#{prod.img}", :id => "one") %>
    <% when 1 %>
      <%= image_tag("#{prod.img}", :id => "two") %>
    <% when 2 %>
      <%= image_tag("#{prod.img}", :id => "three") %>
  <% end %>
<% end %>

См. эту ветку для получения дополнительной информации.

3 голосов
/ 21 августа 2014

Это помогло с пробелами для меня.

<i class="<%
  case blog_post_type
  when :pencil %>fa fa-pencil<%
  when :picture %>fa fa-picture-o<%
  when :film %>fa fa-film<%
  when :headphones %>fa fa-headphones<%
  when :quote %>fa fa-quote-right<%
  when :chain %>fa fa-chain<%
  end
%>"></i>
3 голосов
/ 25 апреля 2013

Вы также можете использовать синтаксис <%- case index -%>:

<% @prods.each_with_index do |prod, index| %>
  <%- case index -%>
  <%- when 0 -%><%= image_tag prod.img, :id => "one") %>
  <%# ... %>
  <%- end -%>
<% end %>
1 голос
/ 07 марта 2012

Я думаю, что в ERB, вам придется поставить условия в очередь под условием когда.Например:

<% @prods.each_with_index do |prod, index| %>
  <% case index %>
    <% when 0 %>
      <%= image_tag("#{prod}", :id => "one") %>
    <% when 1 %>
      <%=  image_tag("#{prod}", :id => "two") %>
    <% when 2 %>
      <%= image_tag("#{prod}", :id => "three") %>
  <% end %>
<% end %>

Ruby поддерживает case-whens с однострочными условиями с ключевым словом then, но я не думаю, что ERB сможет их правильно проанализировать.Пример:

case index
    when 0 then "it's 0"
    when 1 then "it's 1"
    when 2 then "it's 2"
end
...