gpt4 book ai didi

elixir - 使用 Elixir 和 Phoenix 框架形成对象

转载 作者:行者123 更新时间:2023-12-04 03:20:13 25 4
gpt4 key购买 nike

我想知道是否有一种方法可以使用 Elixir 创建表单对象和 Phoenix框架?我想实现类似于 reform 的东西gem 在 Rails因为我不喜欢在每种情况下都运行相同的验证,所以根据我的经验,这会导致代码复杂。那么我可以创建类似以下内容并使其以某种方式工作吗?

defmodule RegistrationForm do
defstruct email: nil, password: nil, age: nil

import Ecto.Changeset

def changeset(model, params \\ :empty) do
model
|> cast(params, ["email", "password", "age"], ~w())
|> validate_length(:email, min: 5, max: 240)
|> validate_length(:password, min: 8, max: 240)
|> validate_inclusion(:age, 0..130)
end

end

最佳答案

这可以在具有虚拟属性的模式上工作:

defmodule RegistrationForm do      
use Ecto.Schema

import Ecto.Changeset

schema "" do
field :email, :string, virtual: true
field :password, :string, virtual: true
field :age, :integer, virtual: true
end

def changeset(model, params \\ :empty) do
model
|> cast(params, ["email", "password", "age"], ~w())
|> validate_length(:email, min: 5, max: 240)
|> validate_length(:password, min: 8, max: 240)
|> validate_inclusion(:age, 0..130)
end
end

如果您指定 __changeset__,这也可以工作结构中的函数或值(这是由 schema 宏自动生成的。) - 然而,这似乎不是故意的方式。
defmodule RegistrationForm do
defstruct email: nil, password: nil, age: nil

import Ecto.Changeset

def changeset(model, params \\ :empty) do
model
|> cast(params, ["email", "password", "age"], ~w())
|> validate_length(:email, min: 5, max: 240)
|> validate_length(:password, min: 8, max: 240)
|> validate_inclusion(:age, 0..130)
end

def __changeset__ do
%{email: :string, password: :string, age: :integer}
end
end

两者都给出以下结果:
iex(6)>  RegistrationForm.changeset(%RegistrationForm{}, %{email: "user@example.com", password: "foobarbaz", age: 12}).valid?
true
iex(7)> RegistrationForm.changeset(%RegistrationForm{}, %{email: "user@example.com", password: "foobarbaz", age: 140}).valid?
false

关于elixir - 使用 Elixir 和 Phoenix 框架形成对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31987989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com