【问题标题】:How to render html from ERB object within a controller?如何从控制器中的 ERB 对象呈现 html?
【发布时间】:2014-03-05 20:00:20
【问题描述】:

我正在尝试从控制器中的 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__) ... ^"

【问题讨论】:

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


    【解决方案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 %>")
    

    &lt;% end %&gt; 块结尾丢失。

    另外,将render :html =&gt; bar(binding) 替换为render :inline =&gt; bar(binding)

    你也可以像下面这样缩短你的代码,

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

    【讨论】:

    • 你完全正确,我改变了它,现在我得到这个错误:“undefined method `each' for nil:NilClass”.. 如何将@users 变量转发到 bar ?
    • 抱歉,我认为您没有聊天权限。检查数据库中是否存在用户。
    • 尝试更新的Func.create,如果用户不存在,它不会抛出错误。
    • 太棒了,它就像一个魅力.. 10X !所以 inline 实际上取代了 html 并包含了它的所有功能?
    【解决方案2】:

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

    【讨论】:

    • 我正在尝试将 html 代码存储在数据库中以保持动态。你认为 helper 更适合这个目的吗?如果是这样,你能解释一下如何从助手渲染一个 html 吗?
    猜你喜欢
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-28
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多