Ruby on rails 呈现存储在Rails数据库中的HTML输出

Ruby on rails 呈现存储在Rails数据库中的HTML输出,ruby-on-rails,forms,rendering,Ruby On Rails,Forms,Rendering,我在数据库字段中存储了一些html内容。我希望我们系统中的可信管理员能够在需要时编辑HTML。最终,这个html将被转换成电子邮件并发送给用户。除了静态html内容外,电子邮件还具有存储在活动记录模型中的名字和姓氏 我希望在管理员编辑内容时将HTML文本保留在内部,然后最终将内容与嵌入的erb电子邮件渲染器结合起来。我有一个部分,管理员可以保存的HTML工作良好 然而,即使忽略电子邮件,只是尝试渲染到一个普通的网页,我也无法获得一个视图来正确地用数据库中的信息替换嵌入的内容。我总是看到替换的文本

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

我希望在管理员编辑内容时将HTML文本保留在内部,然后最终将内容与嵌入的erb电子邮件渲染器结合起来。我有一个部分,管理员可以保存的HTML工作良好

然而,即使忽略电子邮件,只是尝试渲染到一个普通的网页,我也无法获得一个视图来正确地用数据库中的信息替换嵌入的内容。我总是看到替换的文本,而不是替换的文本。我尝试了render\u to\u字符串、render:inline等

总之,我试图:

从数据库中获取一些嵌入了erb的html文本 在模板中运行文本,其中嵌入的erb被传递到局部变量的变量替换 将生成的文本块通过电子邮件发送给用户或显示在网页上,具体取决于我的需要 问题是,结果中总是包含替换,而不是替换

在示例控制器中,我有:

 def showit
    @storedhtml = mymodel.savedhtml
    @emailtext = render_to_string( template: 'e.html.erb',
      layout: false, locals: { user:@user })
   end
e.html.erb包含:

<%= raw @storedhtml %>
我也尝试过这样使用内联:

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

我想你需要的是“液体”——它是Rails的模板语言

看看这个:


我想你需要的是“液体”——它是Rails的模板语言

看看这个:


在不使用Erb语法的控制器中,您将使用普通的Ruby字符串插值:

@stuff = "#{'<p>testme</p>'} #{user.firstname}"
# Or, since the HTML isn't dynamic:
@stuff = "<p>testme</p> #{user.firstname}"
一般来说,直接在控制器中生成HTML不是一个好主意,因为还有其他机制,当您试图找出哪个组件创建了哪个HTML时,它会创建另一个可以查看的位置

我误解了。Sameera建议的另一个模板引擎是一个选项,或者使用当前绑定将DB值作为erb模板进行计算


您还可以创建一个模板解析组件,如果找不到文件,该组件将允许直接从数据库中检索;《手工制作Rails应用程序》一书对此进行了讨论。

在不使用Erb语法的控制器中,可以使用普通的Ruby字符串插值:

@stuff = "#{'<p>testme</p>'} #{user.firstname}"
# Or, since the HTML isn't dynamic:
@stuff = "<p>testme</p> #{user.firstname}"
一般来说,直接在控制器中生成HTML不是一个好主意,因为还有其他机制,当您试图找出哪个组件创建了哪个HTML时,它会创建另一个可以查看的位置

我误解了。Sameera建议的另一个模板引擎是一个选项,或者使用当前绑定将DB值作为erb模板进行计算


您还可以创建一个模板解析组件,如果找不到文件,该组件将允许直接从数据库中检索;《手工制作Rails应用程序》一书对此进行了讨论。

假设您有一个名为template的属性模型,该属性返回一些带有ERB的html模板,如果您想渲染它,您可以在控制器的操作中使用类似的内容:

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

假设您有一个名为template的属性的模型,该属性返回一些带有ERB的html模板,如果您想要呈现它,您可以在控制器的操作中使用类似以下内容:

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

非常感谢您的帮助和详细的回复。我可以用液体来满足我的需要。不过,我对其他解决方案也感兴趣,我将阅读Crafting Rails应用程序手册并阅读他们的讨论。非常感谢您的帮助和详细回复。我可以用液体来满足我的需要。不过,我对其他解决方案也很感兴趣,我将阅读《Crafting Rails应用程序》一书并阅读他们的讨论。谢谢-我能够用Liquid完成这项工作。我将在这里发布我的结果作为一个答案,以防它对其他人有帮助。谢谢你-我能够用液体工作。我会把我的结果贴在这里作为答案,以防它会帮助别人。