elixir - (ArgumentError) 参数错误 - 尝试将值列表传递到变更集时

标签 elixir ecto

我正在尝试将值列表传递给变更集并具有以下方法:

架构和变更集方法:

defmodule Pubcus.Country do

    use Pubcus.Web, :model

  schema "countries" do

    field :code, :string
    field :en, :string
    field :de, :string
    field :it, :string
    field :fr, :string

    timestamps

  end

  def changeset_all(model, list) when is_list(list) do

        list
        |> Enum.map(fn param -> changeset(model, param) end)

  end


  def changeset(model, params \\ %{}) do

        model
    |> cast(params, [:code, :en, :de, :it, :fr])
    |> validate_required([:code, :en])
    |> validate_length(:code, max: 2)
    |> unique_constraint(:code)

  end

end

然后测试:

defmodule Pubcus.CountryModelTest do

    use Pubcus.ModelCase

    alias Pubcus.Country

    @valid_attrs %{ code: "CH", en: "Switzerland", de: "Schweiz", it: "Svizzera", fr: "Suisse" }
    @invalid_attrs %{ code: "CHH" }

    @valid_attrs_list [ %{code: "CH", en: "Switzerland", de: "Schweiz", it: "Svizzera", fr: "Suisse"},
                                          %{code: "IT", en: "Italy", de: "Italien"},
                                          %{code: "FR", en: "Franche", de: "Frankreich"} ]

    test "a valid dataset" do

      changeset = Country.changeset(%Country{}, @valid_attrs)
      assert changeset.valid?

    end

    test "a invalid country code" do

      errors = errors_on(%Country{}, @invalid_attrs)
      assert {:code, "should be at most 2 character(s)"} in errors
      assert {:en, "can't be blank"} in errors

    end

    test "a valid list of countries" do

      changeset = Country.changeset_all(%Country{}, @valid_attrs_list)
      assert changeset.valid?

    end


end

当我测试它时,它显示:

1) test a valid list of countries (Pubcus.CountryModelTest)
     test/models/country_model_test.exs:27
     ** (ArgumentError) argument error
     stacktrace:
       :erlang.apply([#Ecto.Changeset<action: nil, changes: %{code: "CH", de: "Schweiz", en: "Switzerland", fr: "Suisse", it: "Svizzera"}, errors: [], data: #Pubcus.Country<>, valid?: true>], :valid?, [])

我做错了什么?

最佳答案

问题是 Country.changeset_all 返回一个 Ecto.Changeset列表,而不是一个 Ecto.Changeset,所以你不能对此执行 .valid? 。您可以遍历列表并对每个列表进行断言:

for changeset in Country.changeset_all(%Country{}, @valid_attrs_list) do
  assert changeset.valid?
end

关于elixir - (ArgumentError) 参数错误 - 尝试将值列表传递到变更集时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40331044/

相关文章:

debugging - 禁用 Elixir Ecto 调试输出

elixir - 如何将 Elixir 库加载到 iex 而不将其添加到项目的 mix.exs 部门?

elixir - 我应该在 Controller 或模型中为 Elixir Phoenix 使用 Ecto.Repo 吗?

mysql - (Ecto.Query.CompileError) 元组只能用于与相同大小的文字元组进行比较。 - 灵药

elixir - 为什么此代码因 Ecto.NoPrimaryKeyValueError 而失败

postgresql - Ecto:如何用不同的随机数更新所有记录

elixir - with..do..else 语句中出现奇怪的语法错误

elixir - Phoenix Controller - 单数还是复数?

phoenix-framework - Phoenix + Addict - POST 操作的跨域错误

elixir - 在 elixir 中将 Ecto 模型编码为 JSON