I’ve been learning Phoenix and so I followed a tutorial to create a Twitter-like application ( https://youtu.be/MZvmYaFkNJI ) and went by the Programming Phoenix book (especially chapter 5) to integrate logins and sessions into my application. However, posts are always defaulted to the first user (the default on post.ex is 1) and I have no idea how to assign it to the current session user.
My question is: how would I assign a user to a post rather than use the default one? Could provide more details if needed, but pretty much all of my code is in the resources I said above.
I’ve opened a PR with the changes that I think should help you achieve your goal, but I haven’t actually tried them out locally (so they might not work ).
Hey, it worked, thanks a ton! I had to adapt a bit but yeah. It only broke the /posts/ route if I’m logged out, any idea on how to fix it? The error is “no function clause matching in RumblWeb.PostLive.Index.mount/3”, maybe it can’t find an user. I could also redirect them to the root route but I’m not sure how yet.
If there’s not a user_id in the session that is mounted the pattern won’t match.
There are two options, you can pass just the session to the mount like
def mount(_params, session, socket) do
handle_the_session_and_extract_the_user_here()
end
Or you can add another mount function just below the original one that will match when there’s no user_id in the session
@impl true
def mount(_params, %{"user_id" => user_id}, socket) do
#{:ok, assign(socket, :posts, list_posts())}
user = Repo.get(Rumbl.User, user_id)
socket = assign(socket, current_user: user)
if connected?(socket), do: Timeline.subscribe()
{:ok, assign(socket, :posts, list_posts()), temporary_assigns: [posts: []]}
end
# Here you handle your logic for redirect or
# whatever you want
def mount(_params, _session, socket) do
{:ok, socket}
end