调用 sails.renderView 时在 Sails.js 中指定布局文件

Specifying a layout file in Sails.js when calling sails.renderView

我正在使用 sails 辅助方法 sails.renderView 将视图呈现为字符串,然后在电子邮件中使用该字符串,如下所示:

sails.renderView('emails/booking', emailData, function (err, view) {
    emailService.send(user.email, view);
});

这样渲染视图的时候可以指定布局文件吗?我正在使用 ejs 模板引擎。

我似乎无法使用视图配置 (config/views.js),因为它是基于路由的。

我查看了 sails/lib/hooks/views/render.js 中的渲染函数,看起来要使用的布局文件可以在选项对象中传递,但是当我这样做时,没有返回任何视图。

编辑:抱歉,我错过了这是在常规 request/response 上下文之外生成的。答案已更改以反映这一点。

我浏览了 sails 代码,特别是 the render engine

/**
 * sails.hooks.views.render(relPathToView, options, cb_view)
 *
 * @param {String} relPathToView
 *              -> path to the view file to load (minus the file extension)
 *                  relative to the app's `views` directory
 * @param {Object} options
 *              -> options hash to pass to template renderer, including locals and locale
 * @param {Function} cb_view(err)
 *              -> called when the view rendering is complete (response is already sent, or in the process)
 *                  (probably should be @api private)
 * @api public
 */
... lots of code ... 
  // if local `layout` is set to true or unspecified
  // fall back to global config
  var layout = options.layout;
  if (layout === undefined || layout === true) {
    layout = sails.config.views.layout;
  }

事实证明,您可以将布局设置为传递给 sails.renderView()

的选项对象的一部分

因此,如果您有电子邮件模板 emailLayout.ejs,您可以通过将此行添加到您的控制器来使用它,如下所示:

emailData.layout = '/emailLayout';
sails.renderView('emails/booking', emailData, function (err, view) {
    emailService.send(user.email, view);
});

重要警告,这明确仅适用于 ejs 模板。 我还没有测试过这个,所以让我知道它是怎么回事