我正在尝试将值列表传递给变更集并使用以下方法:
架构和变更集方法:
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?, [])
我做错了什么?
答案 0 :(得分:3)
问题在于Country.changeset_all
会返回Ecto.Changeset
的列表,而不是Ecto.Changeset
,因此您无法.valid?
那个。您可以遍历列表并在每个列表上断言:
for changeset in Country.changeset_all(%Country{}, @valid_attrs_list) do
assert changeset.valid?
end