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

Posted

技术标签:

【中文标题】如何在 html.erb 文件中运行多行 Ruby【英文标题】:How do I run multiple lines of Ruby in html.erb file 【发布时间】:2011-03-07 04:58:38 【问题描述】:

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

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

或者像这样:

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

感谢阅读。

【问题讨论】:

为什么要在视图中创建函数?它最有可能属于模型,或者如果不属于控制器,但绝对不属于视图 对不起,我只是快速输入了一些代码作为示例。 【参考方案1】:

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

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

module PeopleHelper
  def name
    #do something
    username
  end
end

另一个非常干净的替代方法是使用Presenter pattern,但我认为它不太常见(不幸的是)。

否则,如果您确实需要在 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>

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

【讨论】:

帮助方法是必经之路,当然。 如何在 html.erb 中使用 PeopleHelper 名称方法? 在帮助器中声明的任何方法都应该在视图中可用(因此考虑到这一点,我现在更喜欢更具体的方法名称,回顾一下)。你不是这样吗?【参考方案2】:

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

如果你想调用像#each这样的块,你可以这样做:

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

别忘了&lt;% end %&gt;

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

您的答案不起作用,它所做的只是将函数的内容放在网页上,将其视为 HTML 而不是 rails 或 ruby​​ 代码i.imgur.com/rhTNtt5.png @barlop 很抱歉没有详细说明。看看我的回答。那对你有用吗?我大概就是这个意思。 显示test: ,,, 因为你的代码有&lt;% 而不是&lt;%= 但这有效i.imgur.com/Gtytbg9.png 所以你可能想要更正你的答案,你应该在发布之前对其进行测试。 @barlop 我不确定我从哪里得到这个想法。但我向你保证,我已经测试过了。也许它适用于其他版本的 Rails 或 erb gem。问题是我不够详细。我目前的解决方案对您有用吗?

以上是关于如何在 html.erb 文件中运行多行 Ruby的主要内容,如果未能解决你的问题,请参考以下文章

如何改进 Ruby on Rails 视图中的代码

Ruby On Rails 部分渲染

ruby view.html.erb_spec.rb

如何在rails上的ruby上传文件?

如何在 ruby​​ on rails 中发布数据

Rails 3 - application.html.erb 中 nil:NilClass 的未定义方法“[]”