我正在尝试使用Elixir上的Phoenix Web框架实现用户身份验证,但是却被这个错误所困扰。
如果我在changeset = Blog.User.changeset(%Blog.User{})
内运行iex
,我会收到以下错误:
** (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
答案 0 :(得分:3)
仅使用
分享基于JustMichael和PatNowak的答案/评论的明确可行解决方案@required_fields ~w(some fields)a
而不是
@required_fields ~w(some fields)
会生成validate_required
所需的原子列表,但似乎仍与cast
一起使用。
答案 1 :(得分:2)
Ecto.Changeset.cast/3将键转换为原子,因此对于强制转换,您可以使用字符串,但Ecto.Changeset.validate_required/3必须将键作为原子处理,因此@required_fields
应该是原子列表。
顺便说一下,应该有sigil ~a
。