Как запустить несколько строк Ruby в файле html.erb - PullRequest
24 голосов
/ 23 июня 2010

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

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

или как это:

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

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

Ответы [ 3 ]

37 голосов
/ 23 июня 2010

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

Для каждого контроллера, если есть помощник, он загружается автоматически. Например, если у вас есть 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>

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

23 голосов
/ 23 июня 2010

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

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

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

Не забудьте <% end %>.

0 голосов
/ 18 марта 2014

Я могу представить, что кому-то нужно это в одном конкретном шаблоне (нет смысла создавать помощника), чтобы не дублировать HTML-разметку.То есть, когда полученная html-страница имеет пару похожих блоков html-разметки.Тем не менее, он может легко злоупотреблять (нечитаемый код).

<% def f1(a, b, c) %>
  test: <%= a %>, <%= b %>, <%= c %>
<% end %>

<% f1(1, 2, 3) %>
<% f1(4, 5, 6) %>
...