Ruby 在erb模板内创建简单类
我在erb(电子邮件模板)中显示重复的内容块,我想我应该创建一个简单的类来表示每个块 我尝试了类似的方法,如果我手动渲染erb,它会起作用,但是如果我尝试发送电子邮件,我会抛出Ruby 在erb模板内创建简单类,ruby,erb,activeview,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 %&g
<%
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!'
/Users/x/appname/app/views/clip\u mailer/send\u clip\u with\u destination.html.erb:205:方法体中的类定义
/usr/local/rvm/gems/ruby-1.9.3-p392/gems/actionpack-3.2.13/lib/action\u view/template.rb:297:in'module\u eval'
/usr/local/rvm/gems/ruby-1.9.3-p392/gems/actionpack-3.2.13/lib/action_view/template.rb:297:在“编译”中
/usr/local/rvm/gems/ruby-1.9.3-p392/gems/actionpack-3.2.13/lib/action_view/template.rb:244:在“编译中的块”中
:10:在“同步”中
/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)
手动渲染模板时,就我所知,您不能在ERB中定义类。即使可以,我也会质疑这种方法背后的设计逻辑——通常,您希望在数据和模板之间保持隔离墙
综上所述,您可以使用返回列表或哈希等的方法来完成类似的任务:
<% def get_data; return {:text => 'blah', :textLink => 'http://www.google.com'}; end %>
<%= get_data[:textLink] %>
'blah',:textLink=>'http://www.google.com'}; 结束%>
有人回答说:“如果你真的想在模板中定义一个类,你可以使用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 %>
为什么不把类声明放到模型中,把所有的填充内容放到控制器中呢?我只是用这个简单的类来构建邮件的主体。这与其他任何事情都无关。我也不是在数据库记录或任何东西中循环,我是在手动构建这些重复块。将类放入模型并不意味着您使用数据库,它可能只是类(模型)。这和控制器中的逻辑是一种约定,非常重要。:)这不完全是一个模型。它更像是一块html的简写。我也研究了部分,但我认为它们不适合这份工作。我喜欢你的解决方案,但这意味着我必须为每次获取键入额外的[:]。我太懒了,不能那样做。典型的鲁比主义者否?不喜欢键入冒号的鲁比主义者并不渴望这个世界;)不管怎么说,OpenStruct解决方案更接近您所陈述的需求,很高兴这一点得到了解决。我希望发表评论的人留下了他的答案。我真的很幸运,所以给我发了电子邮件。我想对他来说没什么意义。