29

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

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

或像这样:

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

谢谢阅读。

4

3 回答 3

39

如果您在视图中需要额外的功能,通常在帮助程序中声明这些功能。

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

module PeopleHelper
  def name
    #do something
    username
  end
end

另一个非常干净的选择是使用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 %>

对我来说,代码缩进比 html 缩进更重要,所以我更喜欢类似的东西

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

但我总是很想听到在这件事上的不同意见。

于 2010-06-23T08:44:52.550 回答
25

在 ERB 文件中定义方法是不常见的,因此我建议不要这样做。

如果你想调用类似的块#each,你可以执行以下操作:

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

不要忘记<% end %>.

于 2010-06-23T08:16:19.637 回答
-1

我可以想象有人在一个特定的模板中需要它(没有必要创建帮助程序)来不重复 html 标记。也就是说,当生成的 html 页面有几个相似的 html 标记块时。但是,它很容易被滥用(不可读的代码)。

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

<% f1(1, 2, 3) %>
<% f1(4, 5, 6) %>
于 2014-03-18T18:20:31.317 回答