8

我想在 Phoenix Framework 中为模型设置默认值,我尝试过:

  def new(conn, _params) do

    user = get_session(conn, :user)
    if is_nil user do
        user = Repo.get_by(User, name: "guest")
        conn = put_session(conn, :user, user)
    end

    changeset = Module.changeset(%Module{})

    changeset
    |> Ecto.Changeset.put_change(:user, user)
    |> Ecto.Changeset.put_change(:version, "0.0.0")
    |> Ecto.Changeset.put_change(:visibility, "public")

    render(conn, "new.html", user: user, changeset: changeset)
  end

如何在模型中设置默认值,以便在渲染 new.html 时显示它们?

顺便说一句,这是我的默认变更集功能。我不知道如何使用它?我假设在演员表之后在管道中使用 Ecto.changeset.put_change?

  def changeset(model, params \\ :empty) do
    model
    |> cast(params, @required_fields, @optional_fields)
  end
4

1 回答 1

7

有几种方法取决于您的变更集功能(您没有在此处提供。)

你可以这样做:

changeset = Module.changeset(%Module{user: user, version: "0.0.0", visibility: "public"})

另一种选择是将参数传递给您的变更集函数:

changeset = Module.changeset(%Module{}, %{user: user, version: "0.0.0", visibility: "public"})

但是,重要的是要注意put_change/3,如果您绑定管道的结果,您的具有该功能的版本也将起作用:

改变:

changeset = Module.changeset(%Module{})

changeset
|> Ecto.Changeset.put_change(:user, user)
|> Ecto.Changeset.put_change(:version, "0.0.0")
|> Ecto.Changeset.put_change(:visibility, "public")

到:

changeset =
  Module.changeset(%Module{})
  |> Ecto.Changeset.put_change(:user, user)
  |> Ecto.Changeset.put_change(:version, "0.0.0")
  |> Ecto.Changeset.put_change(:visibility, "public")

另一种选择是在迁移中的数据库级别设置默认值。如果您查看Ecto.Migration.add/3:default的选项,您将了解如何执行此操作。

于 2015-10-09T00:04:53.323 回答