Я перехожу из Rails в Phoenix и перехожу к проблеме, на которую я не могу найти ответ.Добавление текущей информации пользователя в сообщение в феникс-фреймворке
У меня установлена аутентификация пользователя (путем проверки на @current_user в частной функции аутентификации).
У меня также есть модель публикации/контроллер/вид (эшафот для тех, кто знаком с Rails).
Я хотел бы, чтобы автоматически заполнить поле Начать с @current_user ID, когда форма представляется (каждый пост будет принадлежать пользователю) без поля формы, который пользователь должен заполнить.
В Rails это довольно просто ... что-то вроде этого добавляют к созданию действия почтового контроллера работает:
@post.user = current_user.id
Как сделать это с Phoenix Framework/эликсира?
Вот действие создать в моей 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
Спасибо Gazler. Я отредактировал мой вопрос - у меня есть частная функция, которая проверяет conn.assigns.current_user (и работает); однако, я получаю сообщение об ошибке undefined function current_user. Как обеспечить, чтобы current_user находился в моих conn.assigns? –
Похоже, вы забыли «current_user = conn.assigns.current_user» (который я только показал в первом примере. Я обновил второй, чтобы включить его). Если вы не хотите, чтобы вы вызывали 'conn.assigns.current_user', вы можете посмотреть раздел' overriding: action' в https://hexdocs.pm/phoenix/Phoenix.Controller.html – Gazler
Да. Имеет смысл. Спасибо за вашу помощь! –