【问题标题】:Load the Rails view template from a string instead of a file [duplicate]从字符串而不是文件加载 Rails 视图模板 [重复]
【发布时间】:2016-04-10 03:33:21
【问题描述】:

我的 Rails 应用程序中有一个典型的邮件程序设置,邮件程序类的每个方法都有两个视图(.text.erb 和 .html.erb)。这些视图位于 app/views/ 目录中,并且正在正确呈现。

现在我可以渲染一个标记模板位于字符串变量中的视图,而不是渲染 app/views/* 目录中的文件中的视图吗?

要使用的模板因用户而异,并且是从数据库中挑选出来的。如何渲染这个字符串中的 ERB 模板,而不是渲染视图目录中的模板文件?

一个非常相似的问题,但来自 Django 世界是这样的:Load template from a string instead of from a file

请注意:我不想将渲染视图的输出捕获为字符串。关于这个有几个关于 SO 的问题。

注意那些将其标记为重复的人:这不是关于控制器视图,而是关于邮件视图。每个邮件方法有两个视图,两个视图都需要呈现,然后作为电子邮件中的适当内容发送。

【问题讨论】:

  • @Drenmi 和 Simone Carletti :添加了关于为什么这不是重复的注释。

标签: ruby-on-rails ruby erb


【解决方案1】:

当然。这很简单

render inline: string_template

对于邮件视图:

mail do |format| 
    format.html { render inline: string_template}
end

【讨论】:

  • 我如何对 ActionMailer 视图做同样的事情?我通常调用mail 方法,我相信它会渲染视图,HTMLText 视图也是如此。我怎样才能通过inline 渲染实现相同的效果?
  • 邮件{|格式| format.html {render inline: string_template} }
【解决方案2】:

我会从数据库中获取我的 sting/模板,然后将其与 ERB 内联。这允许您设置实例变量并通过本地绑定将它们传递给 ERB。对我来说,这是最灵活的方法。

def my_action
  template_from_database = "<h1>Hello <%= @instance_var %></h1>"
  @instance_var = 'World'

  render inline: ERB.new(template_from_database).result(binding)
end

【讨论】:

  • 为什么要额外调用 erb?
猜你喜欢
  • 2011-01-11
  • 2017-01-15
  • 2017-12-24
  • 2012-03-16
  • 2012-02-29
  • 2013-01-29
  • 1970-01-01
  • 2011-02-21
  • 2012-01-25
相关资源
最近更新 更多