是否可以在不使用模型的情况下使用Elixir变更集/验证?

时间:2016-11-21 13:06:23

标签: elixir phoenix-framework ecto

这是否就像定义架构和def changeset并且从不编写任何Repo.insert(changeset)一样简单?

4 个答案:

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