2012-08-14 55 views
3

Clojure初學者在這裏!我在Noir項目中爲我的Hiccup代碼添加了Flash消息支持。打嗝條件,我可以使這更加地道?

我想要做的是檢查每個特定的消息字符串是否設置。如果沒有消息,那麼我不想顯示包含該消息的特定閃存元素。

(defpartial success-flash [msg] 
      [:div.alert.notice.alert-success 
      [:a.close {:data-dismiss "alert"} "x"] 
      [:div#flash_notice msg]]) 

(defpartial error-flash [msg] 
      [:div.alert.notice.alert-error 
      [:a.close {:data-dismiss "alert"} "x"] 
      [:div#flash_notice msg]]) 

[..] 

(defpartial layout [& content] 
      (html5 
       [:head 
       [...] 
       [:body 
       (list 
       [...] 
       [:div.container 
       (let [error-msg (session/flash-get :error-message) 
         error-div (if (nil? error-msg)() (error-flash error-msg)) 
         success-msg (session/flash-get :success-message) 
         success-div (if (nil? success-msg)() (success-flash success-msg))] 
         warning-msg (session/flash-get :warning-message) 
         warning-div (if (nil? warning-msg)() (warning-flash warning-msg))] 

        (list error-div success-div warning-div content))])])) 

免責聲明:我完全同意你不會永遠可能在一個情況下,你需要在一次特定的那些閃光的不止一個,但在找出一個更好的沉迷在我嘗試和更多功能的實現方式。

我相信這裏有一個模式可以處理類似的情況。基本上我檢查幾個表達式的值,用這些值做一堆事情,然後根據結果採取行動。你可以用越來越多的怪物(cond)來解決這個問題,但我的解決方案至少有點乾淨。

小貼士?

回答

5

你也可以使用when-let

(defpartial layout 
    [& contents] 
    (html5 
    [:body 
    (when-let [msg (session/flash-get :error-message)] 
     (error-flash msg)) 
    (when-let [msg (session/flash-get :warning-message)] 
     (warning-flash msg)) 
    (when-let [msg (session/flash-get :success-message)] 
     (success-flash msg)) 
    contents)) 

我不是一個打嗝專家,但我認爲這應該工作。我發現它對發生的事情有點清楚,雖然它稍微冗長些。

+0

我很喜歡這個,很乾淨,很到位!我有時會忘記你正在處理呃逆中的矢量,所以你可以用這種方式組合你想要的所有表情。 – 2012-08-14 20:11:53

4

該模式稱爲映射值。下面是使用keep功能應用映射值的圖案的例子,然後過濾他們

(use 'clojure.contrib.core) 


(def flash-message 
[[:error-message error-flash] 
[:success-message success-flash] 
[:warning-message warning-flash]]) 

(keep (fn [m f] (-?>> m (session/flash-get) (f))) flash-message)