2013-06-03 32 views
1

我在erb(電子郵件模板)中顯示重複的內容塊,我想我會創建一個代表每個塊的簡單類。在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)

+0

爲什麼不把類聲明放入模型中並將所有填充內容填入控制器? –

+0

我只是一次使用這個簡單的類來構建電子郵件的正文。這與其他任何事都沒有關係。我也沒有循環數據庫記錄或任何東西,我手動建立這些重複塊。 – portforwardpodcast

+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 %> 
1
工作得很好

就我所知,你不能在erb中定義類。即使可以,我也會質疑這種方法背後的設計邏輯 - 一般來說,您希望在數據和模板之間保持一定的距離。

所有這一切說,你可以完成與返回一個列表或散列等的方法類似:

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

我喜歡你的解決方案,但這意味着我必須爲每個提取輸入一個額外的[:]。我太懶了。典型的紅寶石沒有? – portforwardpodcast

+1

不喜歡打字冒號的Rubyists對於這個世界來說並不算長;)OpenStruct解決方案無論如何都是更貼近您的陳述要求的,因此很高興能夠解決這個問題。 – dliggat

+0

我希望評論的人離開了他的答案。我非常幸運,因此向我發送了電子郵件。我想他沒有意義。 – portforwardpodcast