这是否就像定义架构和def changeset
并且从不编写任何Repo.insert(changeset)
一样简单?
答案 0 :(得分:5)
这是可能的,我发现它是验证API请求的完美方式。
您可以在没有后端的情况下定义模型:
defmodule MyApp.Models.File do
schema "" do
field :description, :string, virtual: true
field :url, :string, virtual: true
field :file_name, :string, virtual: true
field :ext, :string, virtual: true
field :mime, :string, virtual: true
field :size, :integer, virtual: true
end
def new_file_cs(model, params) do
model
|> cast(params, ~w(url file_name ext mime size), ~w(description))
end
end
然后在某处将其称为:
def handle_request(data) do
changeset = File.new_file_cs(%File{}, data)
case changeset.valid? do
true -> :ok
false -> {:error, changeset}
end
end
这样的错误响应可以与phoenix生成的ChangesetView一起使用,以返回统一的错误响应。
总而言之,您的模型应该具有空架构""并且所有字段都应该是虚拟的:true
答案 1 :(得分:1)
Ecto具有embedded_schema
,允许您定义架构并使用更改集而无需定义源。有关详细信息,请参阅here。
答案 2 :(得分:0)
我没看过以后的文档: 您可以在不定义架构https://hexdocs.pm/ecto/2.1.0-rc.4/Ecto.Changeset.html#module-schemaless-changesets
的情况下使用更改集答案 3 :(得分:0)
有一个名为Ecto.Changeset
的{{1}}类似验证库。它允许您验证普通的地图和结构。没有必要的模式或类型。
https://github.com/sticksnleaves/justify
您可以执行以下操作:
Justify
免责声明:我制作了import Justify
dataset =
%{email: "anthony@someemail.com"}
|> validate_required(:email)
|> validate_format(:email, ~r/\A\S@\S\z/)
dataset.valid? == true