Hi there,
This is very easy:
1. Create a function in LayoutView `web/views/layout_view.ex`:
def ogtags(assigns) do
if assigns[:ogtags] do
for {key, value} <- assigns[:ogtags] do
raw("\t\n")
end
else
raw("\t\n")
end
end
Here I was using `content_tag` function but it created closed `</meta>` tag which I don’t really like.
In the else clause you can put some default OG tags, I put only `fb:app_id` fir the start.
2. Add this function to the app layout template `web/templates/layout/app.html.eex`:
<%= ogtags(assigns) %>
Where `assigns` is the map which contains almost everything you need to render the view.
3. Update your controller function with OG tags tuple and pass it to template like this:
def show(conn, %{"token" => token}) do
dream = Repo.get_by!(Dream, token: token)
dream = Repo.preload dream, :user
ogtags = %{
"fb:app_id": "430839153628230",
"og:type": "article",
"og:site_name": "InstaDreams",
"og:title": dream.title,
"og:description": dream.body || dream.title,
"og:audio": InstadreamsPhoenix.Router.Helpers.url(conn) <> "/uploads/dreams/#{dream.user.user_id}/#{dream.audio_filename}.mp3",
}
render(conn, "show.html", dream: dream, ogtags: ogtags)
end
I guess the code here is self-explanatory (I used code from my pet-project www.instadreams.com).
If you have some thought how we can improve the code above feel free to post a comment here 🙂