ggerico
Phoenix guide, Context: call a plug function in a Router scope
I try to reproduce the “Context” example in the phoenix guide. But instead of defining authenticate_user in the router.ex file, I did it in another module called SessionAuth under the web directory which imports only Plug.Conn with a few aliases MyApp.Router.Helpers, Phoenix.Controller and MyApp.Accounts.
in the router:
scope "/cms", MyAppWeb.CMS, as: :cms do
pipe_through [:browser, &MyApp.SessionAuth.authenticate_user/2]
resources "/pages", PageController
end
Then I get
= Compilation error in file lib/my_app_web/router.ex ==
** (ArgumentError) argument error
:erlang.atom_to_list(&MyAppWeb.SessionAuth.authenticate_user/2)
(plug) lib/plug/builder.ex:186: Plug.Builder.init_plug/1
(plug) lib/plug/builder.ex:181: anonymous fn/4 in Plug.Builder.compile/3
(elixir) lib/enum.ex:1811: Enum."-reduce/3-lists^foldl/2-0-"/3
(plug) lib/plug/builder.ex:181: Plug.Builder.compile/3
when authenticate_user is defined and called from the router, there is no error.
when
import MyAppWeb.SessionAuth, only: [authenticate_user: 2]
pipe_through [:browser, :authenticate_user]
there is no error
Most Liked
idi527
I think
pipe_through [:browser, &MyApp.SessionAuth.authenticate_user/2]
is the same as
pipe_through [:browser, fn conn, opts -> MyApp.SessionAuth.authenticate_user(conn, opts) end]
and pipe_through macro expects a list of atoms to call something like apply/3 on, not functions.
I usually call these plugs App.Web.Session or App.Web.Auth.
kylethebaker
I usually do it using module plugs:
pipeline :auth do
plug MyApp.Plugs.AuthUser
end
Then add :auth to your pipeline.
In this case Plugs.AuthUser is a module plug that contains the required init and call functions: Plug — Phoenix v1.8.8
There is possibly a way to it how you’ve described though. I’m not sure what the recommended way would be, but I prefer putting the plug it it’s own module.
I think the issue you’re having is that pipe_through accepts a list of pipelines, so you aren’t able to pass it a function directly.
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








