Skip to content

Instantly share code, notes, and snippets.

@chrismccord
Last active August 8, 2021 17:10
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save chrismccord/31340f08d62de1457454 to your computer and use it in GitHub Desktop.
Save chrismccord/31340f08d62de1457454 to your computer and use it in GitHub Desktop.
Phoenix Content Negotiation
# Controller option 1, implicit render selected based on format
defmodule MyApp.UserController do
use Phoenix.Controller
def show(conn, %{"id" => id}) do
render conn, :show, user: Repo.get(User, id)
end
end
# Controller option 2, explicit render with format pattern match
defmodule MyApp.UserController do
use Phoenix.Controller
def show(conn, %{"id" => id, "format" => "html"}) do
render conn, "show.html", user: Repo.get(User, id)
end
def show(conn, %{"id" => id, "format" => "json"}) do
render conn, "show.json", user: Repo.get(User, id)
end
def show(conn, %{"id" => id, "format" => "xml"}) do
render conn, "show.xml", user: Repo.get(User, id)
end
end
# View
defmodule MyApp.UserView do
use MyApp.View
def render("show.json", %{user: user}) do
%{
name: user.name,
email: user.email
}
end
def render("show.xml", %{user, :user} do
XMLBuilder.build(user)
end
# render("show.html", ...) defined by show.html.eex template automatically
end
@junos
Copy link

junos commented Jan 6, 2017

NM, figure it out

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment