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.

5 Likes

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

What is the form function in your example (do: form(...)? Not sure how that points to the “form.pdf” file.

It’s form.pdf.eex file inside the dir at the path passed to embed_templates