I’m trying to do something fairly simple and for some reason I just can’t figure out the answer.
I have the standard layouts structure with layouts.ex using embed_templates and an app.html.heex in the layouts folder. I want to render other partial templates within app.html.heex so that I don’t end up with one giant file, for example _header.html.heex. If I follow the examples in the docs and what I found online, I should use <%= render("_header.html", assigns) %>, but this throws saying “render/2 not defined”
This makes me think that it’s probably due to using embed_templates, but I have no clue where I should look to get started. I’d be more than happy if someone would also point me in the direction of docs that I should’ve read so that I don’t ask stupid questions like this anymore. Thanks!
Update: I think I figured it out. There’s something magical that happens when you post a question to the forum
Seems like I should’ve read Phoenix.View more thoroughly, on the bottom part there’s a guide talking about migrating fro pre Phoenix 1.7. I should’ve just used <._header />. So far so good. Now I just need to figure out how I can place these partials in a subfolder as I’ll have multiple templates and the folder might get messy.
I didn’t try this but what about playing with the options of embed_templates.
Maybe something like this…
defmodule DemoWeb.Layouts do
use DemoWeb, :html
embed_templates "layouts/**/*"
end
They said in the docs that we can even make multiple calls of embed_templates in the same view module.
Maybe something like this would work as well?
defmodule DemoWeb.Layouts do
use DemoWeb, :html
embed_templates "layouts/*"
embed_templates "layouts/subfolder/*"
embed_templates "layouts/another_subfolder/*"
end
I just found myself in a situation where I also needed to use “partial templates” and I remembered this post. This solution worked well, but if you need something that is in “assigns” within the partial template, here is one way that I found, for anyone interested.
For example, let’s say the partial is “_menu_user_management” and it needs access to @current_user. Here is how the parent template can pass it on to it: