向仅 Rails api 的应用程序添加对渲染视图的支持

Posted

技术标签:

【中文标题】向仅 Rails api 的应用程序添加对渲染视图的支持【英文标题】:Add support for rendering views to a rails api only application 【发布时间】:2017-05-12 01:34:00 【问题描述】:

我构建了一个仅 api 的 rails 应用程序,但由于我使用的是第 3 方电子邮件服务,我需要能够将电子邮件模板呈现为字符串以将其传递给邮件服务包装器 gem。到目前为止,任何将模板呈现为字符串的尝试都会返回一个空字符串,我怀疑这是因为应用程序仅配置为 API。如何添加对将模板呈现为字符串的支持?

如果不是这样,请告诉我。我正在使用邮戳邮件服务。 postmark-rails gem,集成到标准 Rails 邮件程序中根本不起作用,而普通的 postmark gem(使用邮戳 API 而不是邮戳 SMTP 服务器)工作正常,但现在我的问题是为电子邮件生成正确的 html .

这就是我正在尝试的:

html = render_to_string(
            partial: "transfer_mailer/transfer.html.erb",
            locals: 
                :@body => @body,
                :@campaign => @campaign,
                :@chat => @chat
                
        )

但它返回空字符串。

我的设置涉及Rails 5.0.1ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]Sidekiq 4.2.7,并在生产中使用nginx/1.10.2Phusion Passenger 5.1.1。生产环境部署在 Azure 虚拟机中,我添加了入站和出站规则以允许流量通过端口 25、465、2525 和 587。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

查看render_to_string 的文档,看起来路径不需要包含.html.erb,所以也许删除它会解决它。

您可以查看here 获取一些示例代码:

在你的情况下,它会是:

   render_to_string(
       partial: '/transfer_mailer/transfer',
        locals: 
            :@body => @body,
            :@campaign => @campaign,
            :@chat => @chat
        ,
       layout: false
    )

还要确保部分文件名以下划线开头,即使您没有在 render_to_stringrender 调用中包含它。

【讨论】:

很抱歉,但事实并非如此,尤其是因为我有两个模板:一个以html.erb 结尾,另一个以text.erb 结尾。对于邮件模板,这很正常。目前,我的解决方法是在控制器中包含ActionView::Helpers::AssetTagHelper,将文件加载到File 实例中,读取它并将其传递给ERB,如this answer 中所述。无论如何,谢谢你的帮助:)。【参考方案2】:

还有另一种方法可以使用render_to_string 来解决您的问题。请看下面的代码。

@body = XXX
@campaign = YYY
@chat = ZZZ
html = render_to_string(
  file: 'transfer_mailer/transfer.html.erb'
)

希望对你有帮助。

【讨论】:

以上是关于向仅 Rails api 的应用程序添加对渲染视图的支持的主要内容,如果未能解决你的问题,请参考以下文章

Ruby On Rails 部分渲染

从rails中的控制器渲染部分

提高 Rails 视图渲染的性能

Rails 5 - 使用多态关联 - 渲染视图

Rails 3:我的视图没有被渲染

使用 Rails 助手渲染部分