在Rails中渲染存储在数据库中的HTML输出

时间:2011-11-09 18:05:41

标签: ruby-on-rails forms rendering

我有一些html内容存储在数据库字段中。我希望我们系统中值得信赖的管理员能够在需要时编辑HTML。最终,此html将转换为电子邮件并发送给用户。除静态html内容外,电子邮件还有一个名字和姓氏,存储在活动记录模型中。

当管理员正在编辑内容时,我希望将<%= user.firstname user.lastname %>留在HTML文本中,然后最终将内容与嵌入式erb电子邮件渲染器结合起来。我有管理员可以保存HTML工作正常的部分。

但是,即使忽略了电子邮件而只是尝试渲染到普通网页,我也无法获得视图以正确地将嵌入的<%= ... %>替换为数据库中的信息。我总是看到<%= ... %>而不是替换文字。我尝试过render_to_string,render:inline等。

总之,我想:

  1. 从数据库中获取一些嵌入了某些erb的html文本
  2. 通过模板运行文本,其中嵌入的erb替换为传递给locals的变量
  3. 获取生成的文本块,然后根据需要通过电子邮件发送给用户或显示在网页上
  4. 问题是结果总是包含<%= ... %>而不是替换。

    在示例控制器中,我有:

     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
    

3 个答案:

答案 0 :(得分:5)

在控制器中你不会使用Erb语法,你可以使用普通的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模板。

您还可以创建一个模板解析组件,如果没有找到文件,将允许直接从数据库中检索; Crafting Rails应用程序书讨论了这一点。

答案 1 :(得分:1)

我猜你需要的是'液体' - 它是Rails的模板语言。

检查出来:

http://liquidmarkup.org/

http://railscasts.com/episodes/118-liquid

答案 2 :(得分:0)

假设你有一个名为“template”的属性的模型,它返回一些html模板(带有ERB),如果你想渲染它,你可以在控制器的动作中使用这样的东西:

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