Я перехожу с Rails на Phoenix и сталкиваюсь с проблемой, на которую не могу найти ответа.
У меня настроена аутентификация пользователя (путем проверки @current_user в частной функции аутентификации).
У меня также есть модель / контроллер / представление Post (каркас для тех, кто знаком с Rails).
Я хотел бы автоматически заполнять поле сообщения идентификатором @current_user при отправке формы (каждое сообщение будет принадлежать пользователю) без поля формы, которое пользователь должен заполнить.
В Rails это довольно просто ... что-то вроде этого, добавленное к действию create пост-контроллера, работает:
@post.user = current_user.id
Как мне это сделать с помощью Phoenix Framework / Elixir?
Вот действие create в моем PostController
def create(conn, %{"post" => post_params}) do
changeset = Post.changeset(%Post{}, post_params)
case Repo.insert(changeset) do
{:ok, _project} ->
conn
|> put_flash(:info, "Please check your email inbox.")
|> redirect(to: page_path(conn, :thanks))
{:error, changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
Должна ли логика этого типа выполняться в контроллере или в модели? или есть хороший способ сделать это в представлении (без использования скрытого поля, которое небезопасно).
Решение (спасибо Gazler):
def create(conn, %{"post" => post_params}) do
current_user = conn.assigns.current_user
changeset = Post.changeset(%Post{user_id = current_user.id}, post_params)
case Repo.insert(changeset) do
{:ok, _project} ->
conn
|> put_flash(:info, "Please check your email inbox.")
|> redirect(to: page_path(conn, :thanks))
{:error, changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
current_user = conn.assigns.current_user
(который я показал только в первом примере. Я обновил второй, чтобы включить его). Если вы не хотите, чтобы звонитьconn.assigns.current_user
, вы можете взглянуть на разделoverriding :action
в hexdocs.pm/phoenix/Phoenix.Controller.html 29.03.2016conn.assigns.current_user
сократить до более короткого имени и получить к нему доступ из любого места в приложении? 30.06.2017