Подтвердить что ты не робот

Коробка переключения Rails в представлении

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

<% @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 %> где-нибудь в каждой строке? Есть идеи? Спасибо!

4b9b3361

Ответ 1

Вы должны перенести свой первый 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 %>

Ответ 2

Не ставьте много логики в свои взгляды.

я бы добавил вспомогательный

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

чем вы можете вызвать его из представления с помощью

<%= image_tag("#{prod.img}", :id => humanized_number(index)) %>

Ответ 3

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

Во-вторых, операторы 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 %>

Подробнее см. этот.

Ответ 4

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

<% @prods.each_with_index do |prod, index| %>
  <%- case index -%>
  <%- when 0 -%><%= image_tag prod.img, :id => "one") %>
  <%# ... %>
  <%- end -%>
<% end %>

Ответ 5

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

<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>

Ответ 6

Я думаю, что в 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 0"
    when 1 then "it 1"
    when 2 then "it 2"
end