如何处理在phoenix / ecto上创建嵌套记录?

时间:2015-12-05 23:01:48

标签: elixir phoenix-framework ecto

想知道是否有人能够帮我解决一些我一直苦苦挣扎的事情。

长话短说,我有一个模特"用户"和另一个"简介"。个人资料belongs_to用户和用户has_one个人资料。到目前为止一切都很好..

当用户注册时,我需要用户模型的电子邮件和密码以及属于配置文件模型的名字和姓氏。 我的问题是..如何处理用我的RegistrationController中的个人资料插入用户记录?

这里是控制器目前的样子(基于我从Jose关于协会和嵌入的帖子中收集到的内容 -

def create(conn, %{"user" => user_params}) do
    changeset = User.changeset(%User{profile: %Profile{}}, user_params)
                |> Password.generate_password

    case Repo.insert(changeset) do
      {:ok, user} ->
        conn
        |> put_flash(:info, "You have successfully registered and logged in.")
        |> put_session(:current_user, user)
        |> redirect(to: page_path(conn, :index))
      {:error, changeset} ->
        render(conn, "new.html", changeset: changeset)
    end
end

注意:Passoword.generate_password除了用散列密码替换密码外,什么都不做,然后返回变更集。

我已确认user_params确实包含个人资料信息..

但这会引发与...有关的错误。

...只能通过更改集来操纵关联,无论是插入,更新还是删除......

我已经在这方面挣扎了一段时间,如果有人可以提供帮助,那就太棒了:/

提前感谢!

1 个答案:

答案 0 :(得分:2)

我已经想通了。

变更集需要更改为:

changeset = User.changeset(%User{}, user_params)
            |> Password.generate_password
瞧,瞧! :)