我在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_datetime
和time_description
。
我知道函数render_article
会被调用,因为如果我更改它的签名以删除参数我会收到错误
wrong number of arguments (given 1, expected 0)
# (erb):45:in `render_article'
答案 0 :(得分:1)
通过阅读this question的评论和答案,您在尝试做的事情在技术上是不可能的,但相当困难并且不推荐。
正如您的错误消息所指出的那样def
在您可能会&#34;环境中发生了很多事情。期待,你肯定无法自由使用erb
功能&#34;在定义方法时(因为您的上下文与您期望的完全不同)。
&#34; railsy&#34;这样做的方法是添加一个帮助器或使用partial
,但两者都有它们的缺点。 .erb
个文件(因为大多数模板语言)没有&#34;因素&#34;好。如果你想更自由地考虑事物,你应该看看fortitude
gem,它提供了基本上是ruby
- 用于html的DSL,这很容易因素。然而,这与您可能习惯的相比发生了相当大的变化。
如果确实想在.erb
- 文件中定义一个方法,那么你必须完全在一对<% ... %>
括号内完成它仅访问您的参数,不您的上下文。您必须返回基本上为String
的内容,以便能够在<%= ... %>
中使用它,并付出极大的注意力来逃避规则以完成所有事情。这很可能比它的价值更麻烦(但在fortitude
中很容易做到: - )。