首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用map构建Noir验证规则

使用map构建Noir验证规则
EN

Stack Overflow用户
提问于 2013-05-05 16:19:39
回答 2查看 85关注 0票数 0

我得到了动态生成的表单,所以我尝试这样验证它们:

代码语言:javascript
复制
(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,获取了两个特定的字段,以这种方式“手动”构建它们的规则:

代码语言:javascript
复制
(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 (一个动态声明的东西)有关,但我不确定。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-05 17:14:13

不要在操作序列中使用mapmap用于将序列转换为其他东西。您需要使用的是doseq

而不是:

代码语言:javascript
复制
(map (fn [f]
           (vali/rule (vali/has-value? ((keyword f) data))
                      [(keyword f) "Write something!!"]))
         fields))

使用以下命令:

代码语言:javascript
复制
(doseq [f fields]
    (vali/rule (vali/has-value? ((keyword f) data))
                          [(keyword f) "Write something!!"]))
票数 1
EN

Stack Overflow用户

发布于 2013-05-06 01:37:57

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

代码语言:javascript
复制
(doall (map ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16382686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档