ksherman

ksherman

Accessing parameters in nested route resources

Hiya! Super new to the Elixir/Phoenix lang (enjoying it so far!). This might be a really silly question, but have had a hard time finding resources/examples.

So I have a nested route resources, e.g.

resources "/users", UserController, except: [:new, :edit] do
  resources "/lists", ListController, except: [:new, :edit]
end

And then in list_controller, just a basic index:

def index(conn, _params) do
  user_lists = Users.list_user_lists()
  render(conn, "index.json", user_lists: user_lists)
end

So I’d like to scope this index to the lists that belong to the user_id in this route. There’s obviously a lot of examples with pulling in the immediate related record, e.g. def show(conn, %{"id" => id}) do which pulls in the current route’s list_id, but how do I also get the user record?

My one work-around so far in the ListController.create( ) action is to pull it out of params, something like

Users.create_list(list_params, Users.get_user!(conn.params["user_id"]))

Is there a better way I’m missing? Thanks!

Most Liked

BrightEyesDavid

BrightEyesDavid

Hi! Excuse the brevity; I’m on my phone. This is also untested and based on a quick read of the controller guide (Controllers — Phoenix v1.8.8) and my possibly incorrect memory. (It’s been a while since I’ve worked on my Elixir/Phoenix project!)

That being said, I think the usual way for your lists controller would be something like:

def index(conn, %{"user_id" => user_id}) do
  user_lists = Users.list_user_lists(user_id)
  render(conn, "index.json", user_lists: user_lists)
end

def show(conn, %{"user_id" => user_id, "id" => id}) do
  list = Users.get_user_list(id)
  render(conn, "show.json", list: list)
end

From the guide:

It is a good practice to pattern match against params in the function signature to provide data in a simple package we can pass on to rendering.

In the show action above, it may not be necessary to include user_id (and its binding to ‘user_id’) in the pattern match, depending on whether or not the user id is needed when getting the list/preparing data for the view.

Related: see the output of mix phx.routes as per Routing — Phoenix v1.8.8 to see the param names of your router’s routes to use in the pattern matching.

Last Post!

ksherman

ksherman

Ohhh neat, I’ll give that a try, might work a lot nicer.

Where Next?

Popular in Questions Top

rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list. ...
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
sen
Hi All, I set a environment variables in dev.exs , like below code. when i start server, how can i set the ${enable} value? thanks. d...
New
aalberti333
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this: ...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New

Other popular topics Top

electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
axelson
This post is a wiki (feel free to hit the edit button near the bottom right of this post to add your own changes!) This post collects co...
239 49266 226
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
985 44778 311
New
sergio
Kind of like when jquery came out, it was super necessary. Existing drag and drop libraries have a bunch of baggage to support old browse...
New

We're in Beta

About us Mission Statement