0

我有动态生成的表单,所以我试图以这种方式验证它们:

(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))))

它非常适合那些幸运的领域。

我怀疑这与noir.validation 保存错误的方式有关(动态声明的东西),但我不确定。

4

2 回答 2

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!!"]))
于 2013-05-05T09:14:12.583 回答
0

map 返回一个惰性序列。您可以使用 doall 强制评估:

(doall (map ...
于 2013-05-05T17:37:56.540 回答