ChangeSet Ecto.Model Struct的所有字段都是nil

时间:2015-10-25 21:27:04

标签: mongodb elixir phoenix-framework ecto

我正在研究一些Phoenix框架,我遇到了一个奇怪的问题(像往常一样)。每当我尝试创建一些用户时,我都会将User的所有字段设置为nil。我正在使用Mongo.Ecto /

def post_login(conn, %{"login" => login, "password" => password}) do
    # IO.inspect Plug.Conn.read_body(conn)
    a = User.changeset(%User{}, %{"login" => "login", "password" => "password"})
    IO.inspect a
    Repo.insert( a )
    redirect conn, to: "/default"
end

模特:

defmodule HelloWorld.User do
  use HelloWorld.Web, :model

  @primary_key {:id, :binary_id, autogenerate: true}
  schema "users" do
    field :login, :string
    field :password, :string
  end


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

来自控制台的屏幕:

enter image description here

正如你在图片中看到的那样,登录和密码字段都是nils,这让我觉得我做了一些非常愚蠢的事情。

1 个答案:

答案 0 :(得分:3)

字段需要存在于cast/4函数的选项中:

  @required_fields ~w()
  @optional_fields ~w(login password)
  def changeset(model, params \\ :empty) do
    model
    |> cast(params, @required_fields, @optional_fields)
  end

required_fields中但params中没有的任何内容都会在变更集上向该字段添加错误。如果您想要这些字段,只需将它们移到required_fields列表。