Phoenix 1.7: migrating ad hoc template rendering

I just updated a pretty big api-only app running Phoenix 1.6 to 1.7 and everything went smoothy except for one thing that appears no longer to be supported: I was using Phoenix.Template to render ad hoc html in various context functions in order to generate PDFs, via render_template/2. This function no longer exists in the new version of that module.

The original code looked something like this:

use Phoenix.Template, root: "lib/my_app/context/templates"

def make_pdf, do: render_template("form.pdf", %{some: "assign"})

After upgrading, these contexts failed to compile with the error undefined function render_template/2. Fortunately, although templates are one of the areas with the biggest changes in the 1.7 release, most of those changes are about decoupling, so ad hoc rendering is pretty much just as easy:

import Phoenix.Template, only: [embed_templates: 1]

embed_templates "templates/*"

def make_pdf, do: form(%{some: "assign")

Not bad. This feels just a tad more obscure without the “render” verbiage, so I may actually move this logic into a separate module.

Hope this helps! Or, if you are solving a similar problem differently, please share below.


One importance difference I forgot to mention is that the embedded template functions return safe tuples rather than the HTML directly, so you’ll probably need to convert them into strings, e.g. using Phoenix.HTML.safe_to_string