Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在erb模板内创建简单类_Ruby_Erb_Activeview - Fatal编程技术网

Ruby 在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

我在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!'
/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解决方案更接近您所陈述的需求,很高兴这一点得到了解决。我希望发表评论的人留下了他的答案。我真的很幸运,所以给我发了电子邮件。我想对他来说没什么意义。