在erb模板中创建简单类

时间:2013-06-03 10:27:11

标签: ruby erb activeview

我在erb(电子邮件模板)中显示重复的内容块,我想我会创建一个代表每个块的简单类。

我试过这样的东西,如果我手动渲染erb,但是如果我尝试发送我抛出的电子邮件。

<%
class EmailBox
  attr_accessor :text, :textLink,
end
x = EmailBox.new
x.textLink = 'https://www.google.com/' 
x.text = 'blah'
@boxes = []
@boxes.push x
%>

<% @boxes.each do |row| %>
         <a style="text-decoration:none;color:#666;" href="<%=row.textLink%>"><%=row.text%></a>
<% end %>

我得到的错误是:

/Users/x/appname/app/views/clip_mailer/send_clip_with_destination.html.erb:205: class definition in method body
/usr/local/rvm/gems/ruby-1.9.3-p392/gems/actionpack-3.2.13/lib/action_view/template.rb:297:in `module_eval'
/usr/local/rvm/gems/ruby-1.9.3-p392/gems/actionpack-3.2.13/lib/action_view/template.rb:297:in `compile'
/usr/local/rvm/gems/ruby-1.9.3-p392/gems/actionpack-3.2.13/lib/action_view/template.rb:244:in `block in compile!'
<internal:prelude>:10:in `synchronize'
/usr/local/rvm/gems/ruby-1.9.3-p392/gems/actionpack-3.2.13/lib/action_view/template.rb:232:in `compile!'

我正在重复自己,但是当我通过在磁盘上打开模板并运行ERB.new(file).result(binding)

来手动渲染模板时,这很好用

2 个答案:

答案 0 :(得分:1)

据我所知,你不能在erb中定义类。即使你可以,我也会质疑这种方法背后的设计逻辑 - 一般来说,你想在数据和模板之间留下一道隔离墙。

所有这些说,你可以通过返回列表或哈希等的方法来完成类似的事情:

<% def get_data; return {:text => 'blah', :textLink => 'http://www.google.com'}; end %>
<%= get_data[:textLink] %>

答案 1 :(得分:0)

有人回答说“如果你真的想在模板中定义一个类,你可以使用一个Struct ......”然后删除它。我不知道是谁,但我收到了一封电子邮件。无论如何,这导致了我的结构路径,最终我找到了OpenStruct。转换非常简单,占用的线数更少:

<%
x = OpenStruct.new
x.textLink = 'https://www.google.com/' 
x.text = 'blah'
@boxes = []
@boxes.push x
%>

<% @boxes.each do |row| %>
         <a style="text-decoration:none;color:#666;" href="<%=row.textLink%>"><%=row.text%></a>
<% end %>