如何在控制器中从ERB对象渲染html?

时间:2014-03-05 20:00:21

标签: ruby-on-rails ruby ruby-on-rails-3 erb

我正在尝试从控制器内的ERB对象呈现HTML(ERB对象存储在数据库中),但没有成功。

我想做这样的事情:

首先,我创建了一个Func实例:

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

然后,在控制器中:

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__) ... ^"

2 个答案:

答案 0 :(得分: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 :html => bar(binding)替换为render :inline => bar(binding)

您还可以缩短代码,如下所示

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

答案 1 :(得分:0)

你不应该在控制器中这样做。不确定你想要完成什么,但看起来帮助者可能更合适。