Ruby 如何在函数中重用ERB模板代码?

Ruby 如何在函数中重用ERB模板代码?,ruby,erb,Ruby,Erb,我在ERB模板中有这段代码来呈现列表中的所有文章 <% @list.each do |a| %> <article class="my-panel"> <header> <h2><a href="<%= rel_url_to a[:rel_url] %>"><%= a[:name] %></a></h2> <time da

我在ERB模板中有这段代码来呈现列表中的所有文章

    <% @list.each do |a| %>
    <article class="my-panel">
      <header>
        <h2><a href="<%= rel_url_to a[:rel_url] %>"><%= a[:name] %></a></h2>
         <time datetime="<%= to_datetime(a[:time]) %>"><%= time_description(a[:time]) %></time>
      </header>
       ... more stuff cut out
    </article>
    <% end %>
这就是错误:

undefined local variable or method `_erbout' for #<Html::FrontPage:0x0055fb94005c68>
为什么会这样?如何找到更多信息性错误

如何解决这个问题?我可以避免将这个明显占主导地位的html代码移动到ruby helper文件中吗

另外,我怀疑问题在于不能从ERB函数内部访问函数
to_datetime
time\u description

我知道函数
render\u article
确实会被调用,因为如果我更改它的签名以删除参数,就会出现错误

wrong number of arguments (given 1, expected 0)
# (erb):45:in `render_article'

你想做的事情在技术上并不是不可能的,而是相当困难的,而且不推荐,这可以从你的评论和答案中看出

正如您的错误消息所指出的那样,您的
def
不会发生在您“可能”期望的上下文中,并且在定义方法时您肯定无法“自由使用
erb
功能”(因为您的上下文与您期望的完全不同)

“railsy”实现这一点的方法是添加一个助手或使用一个
部分
,但两者都有其缺点
.erb
文件(与大多数模板语言一样)不能很好地“考虑”因素。如果你想更自由地考虑事情,你应该看看提供了基本上是一个
ruby
-DSL for html,它很容易考虑因素。然而,与你可能已经习惯的情况相比,这是一个相当剧烈的变化

如果您真的想在
.erb
-文件中定义一个方法,那么您必须完全在一对
括号中定义,在括号中您只能访问参数,不能访问上下文。您必须返回基本上是
字符串的内容
,以便能够在
中使用它,并非常注意所有内容的转义规则,以使其通过。这可能比它的价值要麻烦得多(但用
坚韧
:-)很容易做到)

undefined local variable or method `_erbout' for #<Html::FrontPage:0x0055fb94005c68>
self.class.instance_variable_get(:@renderer).result(binding)
wrong number of arguments (given 1, expected 0)
# (erb):45:in `render_article'