如何在html.erb文件中运行多行Ruby

ben*_*ben 25 ruby ruby-on-rails erb block

我正在使用Ruby on Rails,需要在我的一个html.erb文件中运行一段Ruby代码.我是这样做的:

<% def name %>
<% name = username %>
<%= name %>
Run Code Online (Sandbox Code Playgroud)

或者像这样:

<% def name
name = username %>
<%= name %>
Run Code Online (Sandbox Code Playgroud)

谢谢阅读.

nat*_*vda 37

如果您在视图中需要额外的功能,通常会在帮助器中声明这些功能.

对于每个控制器,如果有一个帮助器,它会自动加载.例如,如果你有一个PeopleController,在app/helpers文件夹中应该有一个people_helper.rb,它应该是这样的

module PeopleHelper
  def name
    #do something
    username
  end
end
Run Code Online (Sandbox Code Playgroud)

另一个非常干净的选择是使用Presenter 模式,但我认为它不太常见(不幸的是).

否则,如果你确实需要erb视图中的多行ruby代码,我试图避免,我更喜欢以下样式:

<%
   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 %>
Run Code Online (Sandbox Code Playgroud)

另外对我来说代码缩进比html缩进更重要,所以我更喜欢像

<table> 
  <% @rows.each do |row| %>
    <tr>
      <td><%= row.item1 %></td>
      <% if row.some_test %>
        <td><%= row.item2 %></td>
      <% end %>
    </tr>
  <% end %>
</table>
Run Code Online (Sandbox Code Playgroud)

但我总是很有兴趣听到这个问题的不同意见.

  • 当然,Helper方法是可行的方法. (3认同)

shi*_*ara 24

在ERB文件中定义方法是不常见的,所以我建议不要这样做.

如果你想调用一个块#each,你可以做类似以下的事情:

<% names.each do |name| %>
  <%= name %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

别忘了<% end %>.