Elixir/Phoenix partials

This is going to be a very short post. Its intention is to help fellow Ruby on Rails developers who are exploring the new Elixir/Phoenix world.

First, there aren’t “partials” in Phoenix as we know them in Rails. As most parts of Phoenix, things are more explicit. You just render a template in the context of a specific “View” module. That’s all.

i.e. if you had this in Rails

# i.e. if you had a partial rendering like this on in Rails:
<%= render "jobs", jobs: @jobs %>
# you would have this equivalent in Phoenix
<%= render Myapp.Web.JobsView, "_jobs.html", jobs: @jobs %>
# or
<%= render Myapp.Web.JobsView, "_jobs.html", assigns %>

The Phoenix code above would simply use the “context” of the JobsView, and render the content from within “web/templates/jobs/_jobs.html.eex” template. It’s a bit more explicit and a bit more typing; however, in most cases that explicitness helps on the long run.

What about shared partials that are used across most pages? For example, a “sidebar” template. Well, then, what the official guides advise us is to add a simple SharedView module and put all shared templates in, you guessed it, the shared subfolder — “web/templates/shared” (you have to created it).

Then, you can use it like this:

# web/views/shared_view.ex
defmodule Myapp.Web.SharedView do
use Myapp.Web, :view
end
# web/views/shared/sidebar.html.eex
<div>SIDEBAR content</div>
# web/layouts/app.html.eex
<sidebar>
<%= render Myapp.Web.SharedView, "sidebar.html", assigns %></sidebar>

That’s not too bad. Yet, as these are supposed to be “shared” templates that are used a bit more often throughout the app, we can simplify things a bit further by adding a “helper” function “render_shared” like this:

# web/web.ex
def view do
...
def render_shared(template, assigns \\ []) do
render(Myapp.Web.SharedView, template, assigns)
end
end
# then instead of
<%= render Myapp.Web.SharedView, "sidebar.html", assigns %>
# we can use "render_shared"
<%= render_shared "sidebar.html", assigns %>
<%= render_shared "job.html", job: job %>
# etc

All of this isn’t rocket-science, yet, I am sure it could be helpful to people that are just starting with Phoenix 😎. Cheers 🍻.

p.s. remember that Phoenix templates are compiled to functions that use IO Lists — i.e. they are super fast. So, use them as much as you want. I haven’t benchmarked them, but they are regarded to be times faster then Rails’ partials.

p.p.s. shameless plug — if you are into Elixir/Phoenix, you may find Awesome Elixir @ LibHunt helpful as well.

Like what you read? Give Stan Bright a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.