2012-09-11 1 views
2

Je veux créer une fonction de gestionnaire qui prend deux entrées. L'un est un paramètre pris de l'url /name, et le second est un param de la chaîne de requête /name?x=3comment accéder/passer la carte de demande dans un gestionnaire de moustache

(def my-app (app 
       [page-name] (handler page-name))) 

(defn handler 
    [{:keys [params]} page-name] 
    (let [x (params "x")] 
    (-> (page-templ page-name x) response constantly))) 

ci-dessus échoue parce que le gestionnaire attend 2 params, mais je ne fais que passons un.

Comment puis-je obtenir la carte de requête et la transmettre au gestionnaire?

La carte de demande dans le cas ci-dessus contient un paramètre nommé x.

Répondre

1

Il est préférable si vous pouvez envoyer le nom de la page, comme ça:

(app 
[""] (index-page) 
["login"] (serve-login)) 

fonctions ici page d'index et servir-login fonction de retour d'un argument. Req est la requête qui contiendra tous les paramètres url dans la carte clé/valeur. Pour obtenir la valeur de paramètre faire:

(-> req (get :params) (get :x)) 

Donc, la solution complète ressemblerait à quelque chose comme ceci:

(def my-app (app 
       ["page1-name"] (handler))) 

(defn handler [] 
    (fn [req] 
    (let [x (-> req :params :x)] 
     (-> (page-templ page-name x) response)))) 

EDIT: Ne pas oublier d'envelopper votre application dans (wrap-mot-clé params) et (wrap-params), voici comment vous pouvez le faire:

(def my-wrapped-app 
    (-> my-app 
    (wrap-keyword-params) 
    (wrap-params)) 
+1

Une autre chose, vous ne devriez pas utiliser constamment si la réponse dépend de la demande. ** constamment ** est utilisé pour renvoyer rapidement une réponse agnostique, ce qui signifie que cela ne vous intéresse pas si vous avez des paramètres ou non. –

+1

Merci pour la réponse, c'était extrêmement utile. Maintenant, je définis toutes mes fonctions de la manière ci-dessus. Cependant, je ne suis pas capable de faire fonctionner le wrap-keyword-params. Je reçois toujours des clés de chaîne. J'ai posté mon code sur https://github.com/murtaza52/hs-ex – murtaza52

+1

Désolé, votre application Web ne fonctionne pas, mais je pense que si vous spécifiez des wrappers dans la macro de l'application, vous devez inverser leur ordre: (app (wrap-params) (wrap-mot-clé-params) [""] (serve-index)) –

Questions connexes