2014-03-05 74 views
2

我想從控制器內的ERB對象呈現HTML(ERB對象存儲在數據庫中),但沒有成功。如何從控制器中的ERB對象呈現html?

我願做這樣的事情:

首先,我創建了一個Func實例:

Func.Create(text: "<% @users.each do |user| %> 
        <td><%= user.id %></td> 
        <td><%= link_to user.username, user_path(user) %></td>") 

然後,在controlller:

class MainController < ApplicationController 
    def foo 
    @users = User.all 
    render :html => bar(binding) 
    end 

    def bar(controller_binding) 
    html = Func.find(1) 
    template = ERB.new(html.text) 
    template.result(controller_binding) 
    end 
end 

但我得到的是錯誤,如下所示:

"Missing template main/resource_name, application/resource_name with 
    {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :raw, :ruby, 
    :jbuilder, :coffee]}. Searched in: * "c:/Users/david/sample/app/views"" 

"(erb):3: syntax error, unexpected $end, expecting keyword_end ... 
    ut.force_encoding(__ENCODING__) ... ^" 

回答

1

替換

Func.Create(text: "<% @users.each do |user| %> 
        <td><%= user.id %></td> 
        <td><%= link_to user.username, user_path(user) %></td>") 

與塊的

Func.Create(text: "<% if @users.nil? %> 
       <p> There are no users in database </p> 
      <% else %>   
       <% @users.each do |user| %> 
        <td><%= user.id %></td> 
        <td><%= link_to user.username, user_path(user) %></td><% end %> <% end %>") 

<% end %>端缺失。

而且,與render :inline => bar(binding)

更換render :html => bar(binding)你也可以縮短如下代碼,

def foo 
    @users = User.all 
    html = Func.find(1) 
    render :inline => html.text 
    end 
+0

你完全正確,我改變了它,現在我得到這個錯誤:「未定義的方法'每個'爲零:NilClass」..如何將@users變量轉發到bar? – David

+0

請檢查我的更新答案。 –

+0

來吧聊天http://chat.stackoverflow.com/rooms/48530/ror –

0

你不應該在控制器中這樣做。不知道你想要完成什麼,但看起來助手可能更合適。

+0

我想存儲在數據庫中的HTML代碼,以保持它的活力。 你認爲助手是否更適合這個目的? 如果是這樣,你能解釋如何從helper呈現html嗎? – David