2016-03-29 1 views
5

Я перехожу из 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 

ответ

10

Вы можете использовать следующее:

current_user = conn.assigns.current_user 
changeset = Post.changeset(%Post{user_id: current_user.id}, post_params) 

Или используйте Ecto.build_assoc/3:

current_user = conn.assigns.current_user 
changeset = Ecto.build_assoc(current_user, :posts, post_params) 

Это предполагает, что вы current_user в ваш conn.assigns.

+0

Спасибо Gazler. Я отредактировал мой вопрос - у меня есть частная функция, которая проверяет conn.assigns.current_user (и работает); однако, я получаю сообщение об ошибке undefined function current_user. Как обеспечить, чтобы current_user находился в моих conn.assigns? –

+0

Похоже, вы забыли «current_user = conn.assigns.current_user» (который я только показал в первом примере. Я обновил второй, чтобы включить его). Если вы не хотите, чтобы вы вызывали 'conn.assigns.current_user', вы можете посмотреть раздел' overriding: action' в https://hexdocs.pm/phoenix/Phoenix.Controller.html – Gazler

+0

Да. Имеет смысл. Спасибо за вашу помощь! –

Смежные вопросы