【问题标题】:Elixir & Phoenix - ArgumentError at GET /users/newElixir & Phoenix - GET /users/new 的 ArgumentError
【发布时间】: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 是字符串列表,可能 castvalidate_required 需要原子列表。
  • @JustMichael 你完全正确!谢谢!
  • 当然,很高兴为您提供帮助:)

标签: elixir phoenix-framework ecto


【解决方案1】:

只是为了分享一个基于 JustMichael 和 PatNowak 的答案/cmets 的明确可能的解决方案,使用

@required_fields ~w(some fields)a

而不是

@required_fields ~w(some fields)

产生validate_required 需要的原子列表,并且似乎仍然可以与cast 一起使用。

【讨论】:

    【解决方案2】:

    Ecto.Changeset.cast/3 将键转换为原子,因此对于强制转换,您可以使用字符串,但 Ecto.Changeset.validate_required/3 必须将键作为原子处理,因此您的 @required_fields 应该是原子列表。

    顺便说一句-应该有印记~a

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      • 2017-02-05
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 2020-06-21
      相关资源
      最近更新 更多