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

时间:2017-03-07 23:20:47

标签: 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 datetime="<%= to_datetime(a[:time]) %>"><%= time_description(a[:time]) %></time>
      </header>
       ... more stuff cut out
    </article>
    <% end %>

现在我将不得不将其更改为:

<% @list[content_splitter.before_ad_range].each  do |a| %>
   <%= render_article(a) %>
<% end %>

<%= AdCreator.between_content_ad %>

<% @list[content_splitter.after_ad_range].each do |a| %>
   <%= render_article(a) %>
<% end %>

我认为在模板中定义render_article而不是使用html clutter我的ruby代码会很好。但是当我在函数中移动代码时,我得到一个错误。

这是功能:

  <% def render_article(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>

      <div class="image">
        <a href="<%= rel_url_to a[:rel_url] %>"><img alt="" src="<%= rel_url_to a[:img_url_1x] %>" srcset="<%= rel_url_to a[:img_url_2x] %> 2x, <%= rel_url_to a[:img_url_3x] %> 3x"></a>
      </div>

      <div class="text">
        <%= a[:article_text] %>
      </div>
    </article>
  <% end %>

这是错误:

undefined local variable or method `_erbout' for #<Html::FrontPage:0x0055fb94005c68>

产生此错误的代码行是:

self.class.instance_variable_get(:@renderer).result(binding)

为什么会这样?如何找到更多信息量错误?

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

PS。我怀疑问题是无法从ERB函数内部访问函数to_datetimetime_description

我知道函数render_article会被调用,因为如果我更改它的签名以删除参数我会收到错误

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

1 个答案:

答案 0 :(得分:1)

通过阅读this question的评论和答案,您在尝试做的事情在技术上是不可能的,但相当困难并且不推荐。

正如您的错误消息所指出的那样def在您可能会&#34;环境中发生了很多事情。期待,你肯定无法自由使用erb功能&#34;在定义方法时(因为您的上下文与您期望的完全不同)。

&#34; railsy&#34;这样做的方法是添加一个帮助器或使用partial,但两者都有它们的缺点。 .erb个文件(因为大多数模板语言)没有&#34;因素&#34;好。如果你想更自由地考虑事物,你应该看看fortitude gem,它提供了基本上是ruby - 用于html的DSL,这很容易因素。然而,这与您可能习惯的相比发生了相当大的变化。

如果确实想在.erb - 文件中定义一个方法,那么你必须完全在一对<% ... %>括号内完成它访问您的参数,您的上下文。您必须返回基本上为String的内容,以便能够在<%= ... %>中使用它,并付出极大的注意力来逃避规则以完成所有事情。这很可能比它的价值更麻烦(但在fortitude中很容易做到: - )。