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

Как сделать несколько строк Ruby в файле html.erb

Я использую Ruby on Rails и должен запускать блок кода Ruby в одном из файлов html.erb. Я делаю это следующим образом:

<% def name %>
<% name = username %>
<%= name %>

или вот так:

<% def name
name = username %>
<%= name %>

Спасибо за чтение.

4b9b3361

Ответ 1

Необычно определить метод в файле ERB, поэтому я рекомендую против него.

Если вы хотите вызвать блок типа #each, вы можете сделать что-то вроде следующего:

<% names.each do |name| %>
  <%= name %>
<% end %>

Не забывайте <% end %>.

Ответ 2

Если вам нужны дополнительные функции, вы обычно объявляете их внутри помощника.

Для каждого контроллера, если есть помощник, он автоматически загружается. Например, если у вас есть PeopleController, в папке app/helpers должен быть people_helper.rb, и он должен выглядеть так:

module PeopleHelper
  def name
    #do something
    username
  end
end

Другая, очень чистая альтернатива - использовать Presenter шаблон, но я думаю, что это реже (к сожалению).

В противном случае, если вам нужно несколько строк кода ruby ​​внутри представления erb, которое я стараюсь избегать, я предпочитаю следующий стиль:

<%
   counter_1 = 0
   counter_2 = 1
   do_some_more_prep_here
 %>
<% @records.each do |rec|%>
  <%# do something with the prepped date in each row %>
<% end %>

Также для меня отступ кода более важен, чем отступ html, поэтому я предпочел бы что-то вроде

<table> 
  <% @rows.each do |row| %>
    <tr>
      <td><%= row.item1 %></td>
      <% if row.some_test %>
        <td><%= row.item2 %></td>
      <% end %>
    </tr>
  <% end %>
</table>

Но мне всегда очень интересно слышать разные мнения в этом вопросе.

Ответ 3

Кажется, я знаю пример использования, о котором вы просите. Если есть фрагмент шаблона, который вы не хотите дублировать или помещать в другой файл, можно сделать это следующим образом:

...
<% def fragment a, b, c; _buf = '' %>
    ...
<% _buf; end %>
...
<%= fragment(1, 2, 3).chomp %>
...
<%= fragment(4, 5, 6).chomp %>
...