3

ここでClojure初心者!NoirプロジェクトのHiccupコードにフラッシュメッセージのサポートを追加しました。

私がやろうとしているのは、それぞれの特定のメッセージ文字列が設定されているかどうかを確認することです。メッセージがない場合は、そのメッセージを含む特定のフラッシュ要素を表示したくありません。

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

免責事項:一度に複数の特定のフラッシュをオンにする必要がある状況になる可能性はほとんどないことに完全に同意しますが、これを実装するためのより優れた、より機能的な方法を見つけようと私を甘やかしてください。

同様の状況を処理するためのパターンがそこにあると私は確信しています。基本的に、私はいくつかの式の値をチェックし、それらの値を使ってたくさんのことを行い、その結果に基づいて行動します。次第に巨大な(条件)でこれをやってのけることができますが、私の解決策は少なくともいくらかきれいです。

チップ?

4

2 に答える 2

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

私はしゃっくりの専門家ではありませんが、これでうまくいくと思います。少し冗長ですが、何が起こっているのかが少し明確になります。

于 2012-08-14T14:27:07.230 に答える
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)
于 2012-08-14T08:44:43.777 に答える