ggerico

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

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

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.

Last Post!

ggerico

ggerico

Tks for the explanation.

I ended up with

import MyAppWeb.SessionAuth, only: [authenticate_user: 2] # import plug function
pipe_through [:browser, :authenticate_user]

And if the module MyApp.SessionAuth becomes too big, I will split it into MyApp.Web.Session and MyApp.Web.Auth and use module plugs instead.

Where Next?

Popular in Questions Top

Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" => #BSON.ObjectId<58eb1a7a9ad169198c3dXXXX>, "email" => ...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
Lily
In templates/appointment/index.html.eex: <%= for appointment <- @appointments do %> <tr> <td><%= appoi...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New

Other popular topics Top

KronicDeth
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine) This is a plugin that adds support for Elixir to JetBrains IntelliJ...
289 36820 110
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
msaraiva
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
564 44265 214
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New

We're in Beta

About us Mission Statement