2011-11-09 57 views
1

我有一些html內容存儲在數據庫字段中。我希望我們的系統中的可信管理員能夠在需要時編輯HTML。最終這個html將被轉換成電子郵件消息併發送給用戶。除了靜態HTML內容之外,電子郵件還具有存儲在活動記錄模型中的名字和姓氏。在Rails中呈現存儲在數據庫中的HTML輸出

當管理員編輯內容時,我希望在HTML文本內部保留<%= user.firstname user.lastname %>,然後將內容與嵌入的erb電子郵件渲染器事件結合。我有管理員可以保存HTML的部分工作正常。

但是,即使忽略電子郵件,只是嘗試渲染到一個正常的網頁,我無法得到一個視圖正確替換嵌入式<%= ... %>與數據庫中的信息。我總是看到<%= ... %>而不是替代文字。我曾嘗試render_to_string,渲染:在線等

綜上所述,我想:

  1. 採取嵌入一些ERB一些HTML文本從數據庫
  2. 貫穿一個範本中的文字嵌入式再培訓局被替換爲傳遞到當地人的變量
  3. 承擔由此產生的文本塊,要麼根據我的需要,通過電子郵件發送給用戶或顯示在網頁上

問題是結果總是有<%= ... %>而不是替換。

在一個示例中控制器I具有:

def showit 
    @storedhtml = mymodel.savedhtml 
    @emailtext = render_to_string(template: 'e.html.erb', 
     layout: false, locals: { user:@user }) 
    end 

的e.html.erb包含:

<%= raw @storedhtml %> 

和showit.html.erb具有:

= raw @emailtext 

我也嘗試使用這樣的內聯:

def showit 
    # the line below is substituted but the <p> tags are not converted 
    @stuff = "<%= '<p>testme</p>' + user.firstname %>" 
    @storedhtml = mymodel.the_html_content 
    @output = render(inline: @storedhtml, locals: { user:@user }, layout: true) 
end 

回答

5

在控制器,你不會使用厄爾布語法,你會使用一般的Ruby字符串插值:

@stuff = "#{'<p>testme</p>'} #{user.firstname}" 
# Or, since the HTML isn't dynamic: 
@stuff = "<p>testme</p> #{user.firstname}" 

而且將其輸出到您需要使用的視圖中html_safe

<%= @stuff.html_safe %> 

一般來說,直接在控制器中生成HTML並不是一個好主意,因爲還有其他機制,並且當您試圖弄清楚什麼組件創建哪個HTML時,它會創建另一個位置。

編輯我誤解了。 Sameera提出的另一個模板引擎是一種選擇,或者只是使用當前綁定將DB值作爲erb模板進行評估。

您也可以創建一個模板解析組件,如果沒有找到文件,它將允許直接從數據庫中檢索; The Crafting Rails應用程序手冊討論了這一點。

+0

非常感謝您的幫助和您的詳細回覆。我可以用Liquid來滿足我的需求。我對其他解決方案也很感興趣,但我會看看Crafting Rails應用程序書並閱讀他們的討論。 – Tree

0

假設你有一個名爲「模板」的屬性,它返回一些HTML模板(與ERB)模型,如果你想渲染它,你可以使用這樣的事情到控制器中的作用:

render inline:"<%= raw ERB.new(@your_var.template).result(binding) %>".html_safe, layout:'application' 
相關問題