2014-03-05 39 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