Elixir Ecto: 使用非持久化的Ecto Schema验证GET参数

HTTP是文本协议, 传递给服务器的参数全部都是字符串, 要在Elixir中使用, 需要转换为合适的类型. 本文使用Ecto Changset内置的cast/3函数对数据类型进行转换. 使用 validate_* 系列函数对参数的值进行验证. Ecto 相关函数文档为 https://hexdocs.pm/ecto/Ecto....

定义模型

定义一个分页参数验证模型

defmodule TgMhs.Pagination do
  use TgMhs.Web, :model

  @required_fields ~w(direction id from_id to_id chat_type)
  @optional_fields ~w()

  schema "pagination" do
    field :direction, :string
    field :id,        :integer
    field :from_id,   :integer
    field :to_id,     :integer
    field :chat_type, :string
  end

  def changeset(model, params \\ :empty) do
    model
    |> cast(params, @required_fields, @optional_fields)
    |> validate_inclusion(:direction, ["middle", "up", "down"])
    |> validate_inclusion(:chat_type, ["peerUser", "peerChat", "peerChannel"])
  end

  def changeset_errors(changeset) do
     changeset.errors
     |> Enum.map(fn {k, v} -> "Parameter #{k} #{render_detail(v)}" end)
  end  
end

在控制器中验证

defmodule TgMhs.HelloController do
  use TgMhs.Web, :controller
  alias TgMhs.Pagination

  def index(conn, params) do
    changeset = Pagination.changeset(%Pagination{}, params)

    case changeset do
      %{:params => %{ 
          "direction" => direction, 
          "id" => id, 
          "from_id" => from_id, 
          "to_id" => to_id, 
          "chat_type" => chat_type
      }, :valid? => true} ->
        conn |> text("OK")
      _ ->
        conn
        |> put_status(400)
        |> text("Error, wrong parameters supplied!")
    end
  end
end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值