【发布时间】:2017-04-18 22:13:21
【问题描述】:
我试图在 Elixir 上使用 Phoenix Web 框架实现用户身份验证,但被这个错误难住了。
如果我在 iex 内运行 changeset = Blog.User.changeset(%Blog.User{}),我会收到以下错误:
** (ArgumentError) unknown field "email" for changeset on
%Blog.User{__meta__: #Ecto.Schema.Metadata<:built, "users">, email:
nil, id: nil, inserted_at: nil, is_admin: false, name: nil, password:
nil, password_hash: nil, posts: #Ecto.Association.NotLoaded<association
:posts is not loaded>, updated_at: nil}
(ecto) lib/ecto/changeset.ex:1318: Ecto.Changeset.ensure_field_exists!/2
(ecto) lib/ecto/changeset.ex:1305: anonymous fn/5 in Ecto.Changeset.validate_required/3
(elixir) lib/enum.ex:1755: Enum."-reduce/3-lists^foldl/2-0-"/3
(ecto) lib/ecto/changeset.ex:1304: Ecto.Changeset.validate_required/3
这是我的模型web/models/user.ex:
defmodule Blog.User do
use Blog.Web, :model
schema "users" do
field :email, :string
field :name, :string
field :password, :string, virtual: true
field :password_hash, :string
field :is_admin, :boolean, default: false
has_many :posts, Blog.Post
timestamps()
end
@required_fields ~w(email)
@optional_fields ~w(name is_admin)
def changeset(struct, params \\ %{}) do
struct
|> cast(params, @required_fields ++ @optional_fields)
|> validate_required(@required_fields)
end
end
【问题讨论】:
-
这只是一个疯狂的猜测,但
@required_fields和@optional_fields是字符串列表,可能cast或validate_required需要原子列表。 -
@JustMichael 你完全正确!谢谢!
-
当然,很高兴为您提供帮助:)
标签: elixir phoenix-framework ecto