使用map构建Noir验证规则

时间:2013-05-05 08:19:39

标签: 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-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(一个动态声明的东西)有关,但我不确定。

2 个答案:

答案 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 ...