Validation 使用map构建Noir验证规则

Validation 使用map构建Noir验证规则,validation,clojure,noir,Validation,Clojure,Noir,我有动态生成的表单,所以我尝试通过以下方式验证它们: (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-val

我有动态生成的表单,所以我尝试通过以下方式验证它们:

(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))))
(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))))
但这行不通。没有任何异常或消息,
valid?
的计算结果为
true
,因此,尽管所有字段都为空,但流程仍将继续,就好像没有错误一样。我甚至尝试了
(vali/has value?nil)
强制执行错误,但没有任何更改

在实验中,我删除了
地图
,选取了两个特定字段,以这种方式“手动”构建它们的规则:

(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))))
(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))))
它对那些幸运的领域非常有效


我怀疑它与(动态声明的东西)有关,但我不确定。

不要使用
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!!"]))

map返回一个惰性seq。您可以使用doall强制求值:

(doall (map ...