2017-04-22 5 views
0

Je souhaite accéder à l'URL de la page en cours dans mes modèles Selmer afin de pouvoir la passer à une action d'édition de page afin que cette page puisse inclure un lien vers la page "appelant" même après la modification.Un moyen facile d'accéder à la carte de demande dans chaque modèle selmer?

est ici le code de modèle dans mon modèle Selmer - cela semble OK:

<a href="/photos/_edit/{{p.path}}{% if back %}?back={{back}}{% endif %}" 
     class="btn btn-warning btn-sm">edit</a> 

Voilà comment je définir la valeur de retour lors de la recherche:

(defn photo-search [word req] (layout/render "search.html" {:word word :photos (db/photos-with-keyword-starting word) :back (str (:uri req) "?" (:query-string req)) })) ;; ... (defroutes home-routes ;; ... (GET "/photos/_search" [word :as req] (photo-search word req))

Cela fonctionne bien. Cependant j'ai d'autres méthodes qui renvoient des listes de photos, et il semble violer le principe DRY pour ajouter ce code à toutes les autres méthodes.

Existe-t-il un moyen plus simple de le faire, peut-être avec un logiciel intermédiaire?

Répondre

0

Une approche que vous pourriez essayer est de créer votre propre fonction render qui enveloppe Selmer et fournit la fonctionnalité commune que vous voulez sur chaque page. Quelque chose comme:

(defn render 
    [template request data] 
    (let [back (str (:uri req) "?" (:query-string req))] 
    (layout/render template (assoc data :back back)))) 

(defroutes home-routes 
    (GET "/photos/" [:as req] 
    (->> {:photos (db/recent-photos)} 
     (render "list.html" req))) 

    (GET "/photos/_search" [word :as req] 
    (->> {:word word 
      :photos (db/photos-with-keyword-starting word)} 
     (render "search.html" req)))) 

(Pour une raison quelconque, je aime vraiment utiliser les macros de filetage dans les routes, même si leur sans doute ne sont pas assez de liens dans le fil pour la justifier ...)