Phoenix can already implicitly render different responses based off the Accept header or through forcing a type through the put_accept plug.
def index(conn, _params) do
doors = Access.list_doors()
render(conn, :index, doors: doors)
end
Will render "index.json" or "index.html" implicitly.
See https://gist.github.com/chrismccord/31340f08d62de1457454.
In the Phoenix Docs: https://hexdocs.pm/phoenix/Phoenix.Controller.html#render/3
Specifically;
template - which may be an atom or a string. If an atom, like :index, it will render a template with the same format as the one returned by get_format/1. For example, for an HTML request, it will render the "index.html" template. If the template is a string, it must contain the extension too, like "index.json"