2013-05-05 24 views
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)))) 

而且它完全適用於那些幸運的領域。

我懷疑它與the way noir.validation saves the errors(一個動態聲明的事物)有關,但我不確定。

回答

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!!"])) 
+0

這樣做了。謝謝。 – eseca 2013-05-05 21:00:48

0

地圖返回一個懶起。您可以使用doall強制進行評估:

(doall (map ...