【问题标题】:Using Prismatic/schema for form validation with Liberator使用 Prismatic/schema 通过 Liberator 进行表单验证
【发布时间】:2014-11-12 17:28:58
【问题描述】:
Prismatic/schema 是否适合表单验证?我以前从未设计过表单验证库,但我想它会输出类似这样的东西,而不是在s/validate 上抛出异常:
{::errors {:name [{:missing "Required field."}
{:length "Must be at least 3 characters."}]
:email [{:email "Must be a valid email address"}]}}
我希望有人将它与 Compojure 和 Liberator 一起使用,但我在网上找不到任何东西。
【问题讨论】:
标签:
validation
clojure
liberator
plumatic-schema
【解决方案1】:
在Dante on GitHub找到了一些好帮手,但是使用许可不清楚:
(ns dante.tools.schemas
(:require [dante.tools.namespaces :refer [export]]
[schema.core :as s]
[schema.coerce :as coerce]
[schema.utils :refer [validation-error-explain]])
(:import [schema.utils NamedError ValidationError]))
(defn explain [errors]
(cond
(map? errors)
(->> errors
(map (fn [[k v]]
[k (explain v)]))
(into {}))
(or (seq? errors)
(coll? errors))
(map explain errors)
(instance? NamedError errors)
[(.name errors)
(explain (.error errors))]
(instance? ValidationError errors)
(str (validation-error-explain errors))
:else
(str errors)))
(defn- coercercions [schema]
(or
(coerce/+string-coercions+ schema)
(coerce/set-matcher schema)))
(defn validate [schema value]
((coerce/coercer schema coercercions) value))
【解决方案2】:
一段时间以来,我一直在使用 Schema 进行共享表单验证 (ClojureScript) 和服务器端 (Clojure),结果非常好。
我最初在 GitHub 上发布了这样使用 Schema 的建议:
Link here
如果您需要更多示例,请告诉我。
【解决方案3】:
根据您对验证失败所需的错误映射的描述,看起来Validateur 适合。引用他们的入门页面:
Validateur 是一个受 Ruby 的 ActiveModel 启发的验证库。 Validateur 是函数式的:验证器是函数,验证集是高阶函数,验证结果作为值返回。
围绕这个小核心,Validateur 可以使用您可能需要的任何自定义验证器进行扩展:它就像定义符合直接合同的 Clojure 函数一样简单。