Ответ 1
Необычно определить метод в файле ERB, поэтому я рекомендую против него.
Если вы хотите вызвать блок типа #each
, вы можете сделать что-то вроде следующего:
<% names.each do |name| %>
<%= name %>
<% end %>
Не забывайте <% end %>
.
Я использую Ruby on Rails и должен запускать блок кода Ruby в одном из файлов html.erb. Я делаю это следующим образом:
<% def name %>
<% name = username %>
<%= name %>
или вот так:
<% def name
name = username %>
<%= name %>
Спасибо за чтение.
Необычно определить метод в файле ERB, поэтому я рекомендую против него.
Если вы хотите вызвать блок типа #each
, вы можете сделать что-то вроде следующего:
<% names.each do |name| %>
<%= name %>
<% end %>
Не забывайте <% end %>
.
Если вам нужны дополнительные функции, вы обычно объявляете их внутри помощника.
Для каждого контроллера, если есть помощник, он автоматически загружается. Например, если у вас есть 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>
Но мне всегда очень интересно слышать разные мнения в этом вопросе.
Кажется, я знаю пример использования, о котором вы просите. Если есть фрагмент шаблона, который вы не хотите дублировать или помещать в другой файл, можно сделать это следующим образом:
...
<% def fragment a, b, c; _buf = '' %>
...
<% _buf; end %>
...
<%= fragment(1, 2, 3).chomp %>
...
<%= fragment(4, 5, 6).chomp %>
...