我有动态生成的表单,所以我试图以这种方式验证它们:
(defn valid? [media-id data] ;media-id it's just a number, data is the form input
(let [fields (common/get-fields-to-show media-id)] ; list of strings (the field names)
(map (fn [f]
(vali/rule (vali/has-value? ((keyword f) data))
[(keyword f) "Write something!!"]))
fields))
(not (apply vali/errors? (map keyword fields))))
但它不起作用。根本没有例外或消息,valid?
被评估为true
,因此尽管所有字段都为空,但流程仍然继续,就像没有错误一样。我甚至尝试(vali/has-value? nil)
强制错误,但没有任何改变。
尝试,我删除了map
,取了两个特定的字段,以这种方式“手动”构建规则:
(defn valid? [media-id data]
(let [fields (common/get-fields-to-show media-id)
f1 (first fields)
f2 (second fields)]
(vali/rule (vali/has-value? ((keyword f1) data))
[(keyword f1) "Testing"])
(vali/rule (vali/has-value? ((keyword f2) data))
[(keyword f2) "Testing"])
(not (apply vali/errors? (map keyword fields))))
它适用于那些幸运的领域。
我怀疑它与the way noir.validation saves the errors(一个动态声明的东西)有关,但我不确定。
答案 0 :(得分:1)
不要将map
用于操作序列。 map
用于将序列转换为其他内容。您需要使用的是doseq
而不是:
(map (fn [f]
(vali/rule (vali/has-value? ((keyword f) data))
[(keyword f) "Write something!!"]))
fields))
使用此:
(doseq [f fields]
(vali/rule (vali/has-value? ((keyword f) data))
[(keyword f) "Write something!!"]))
答案 1 :(得分:0)
map返回一个懒惰的seq。您可以使用doall强制进行评估:
(doall (map ...