Elixir& Phoenix - GET / users / new中的ArgumentError

时间:2017-03-31 07:28:05

标签: elixir phoenix-framework ecto

我正在尝试使用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

2 个答案:

答案 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