lee
Disabling layouts by default
I’m new to Phoenix (and Elixir in general); I’m coming to Phoenix from a Javascript background (I’m the author of ReactQL, to give you an idea on the typical stack I’m used to.), so forgive me if the naïve/novice query.
One thing that stumped me immediately in Phoenix was the implicit templates/layout/app.html.eex. I’m developing a pretty typical app which is chunked into several sections - a public front-end, the user app itself, an admin area, an API. Having a default central layout doesn’t serve the requirements of this app, so I spent the first little while trying to figure out how to disable it.
What I wound up with was just a plug in the :browser pipeline, pointing to a private function that disables the default layout. I then deleted templates and layout_view.ex. Finally, in my controllers, I created a second plug for specifying routes connections to that particular controller.
Whilst this was fairly trivial to do (and I’m not even sure that’s the only - or right - way to go about it), the notion of first disabling the layout and then setting a new one seems a bit like a code smell to my novice Phoenix nose. In other frameworks I’ve worked with, layouts don’t tend to be assumed until explicitly set; I’ve found they’re often not required.
So for my introductory question to this board (and thanks in advance for helping to further my currently very basic understanding of Phoenix!), I’m curious what prompted the design decision to make layout/app.html.eex (and LayoutView) an implicit choice? My first instinct was to search Phoenix generated code to look for a specific reference to “app.html”, assuming that I’d just need to comment out the default line to prevent it… but it looks like LayoutView is hard-coded in lib code.
Again, I’m new here so I may be missing something obvious, but this did strike me as a tad opinionated and I’m curious what may have led to it.
Most Liked
hlx
Phoenix allows you to changes pretty much anything you want and I think most of the projects require an layout so they made it default.
You could do it like this:
# router.ex
pipeline :no_layout do
plug: :put_layout, false
end
scope "/api", MyAPI do
pipe_through [:browser, :no_layout]
( ... )
end
I fail to understand what you mean by this? Maybe the scope and extra pipeline make the second plug not needed anymore?
lpil
I would say that in general Phoenix is an opinionated framework that makes a lot of opinionated decisions in order to provide a particular experience that fits the majority of web apps.
Whether this is the best way if a matter of personal preference. I think myself I would prefer it to be explicit and in the generated code, as you’ve suggested.
hlx
I have to agree, having the plug :put_layout, {MyApp.LayoutView, :app} generated by default in the router would be nicer
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #javascript
- #code-sync
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance









