2014-09-10 206 views
1

鉴于一些的Compojure路线:重定向回到原来的页面

(defroutes app-routes 
    (GET "/" [] (display-some-html)) 
    (GET "/story" [] (display-more-html)) 
    (GET "/classes" [] (display-other-html)) 
    (POST "/delete" [id] (do (delete-some-id-from-db id) 
          (magic-redirect-function))) 
    (route/resources "/") 
    (route/not-found "Not Found")) 

假如我能够从//story/classes POST到/delete。我将如何重定向到POST请求源自的页面?

+0

每次您使用POST进行DELETE操作时,小猫都会死亡。你也可以包括在POST请求的URL重定向到(即当前页面的URL),然后作为deadghost答案demoes到'ring.util.response/redirect'一个呼叫时使用。 – schaueho 2014-09-11 06:47:43

+0

@schaueho POST改变了​​我的实际代码进行删除。在请求中包含重定向url也是一个很好的解决方案,尽管目前session + middleware解决方案看起来最干净。 – deadghost 2014-09-11 08:05:00

+0

会话的一个潜在问题 - 有一个假设,请求按顺序排列。如果它们并行 - 例如,如果用户在同一浏览器中有几个选项卡打开 - 用户可以重定向到意外页面。重定向URL包含在删除请求中的解决方案没有这个问题。 – ez121sl 2014-09-11 11:50:46

回答

1

通常的方法是让以前的网址在您的会话,并重定向用户有/渲染你的操作后,相应的视图。如果您使用的是site handler,则已包含包装会话。

你可以做从Ring wiki类似于此示例的东西,它是微不足道的改变存储请求路径,而不是数量。

(defn handler [{session :session}] 
    (let [count (:count session 0) 
     session (assoc session :count (inc count))] 
    (-> (response (str "You accessed this page " count " times.")) 
     (assoc :session session)))) 
+0

这个答案是好的,但也许它也应该包括必要的重定向功能的详细信息? – noisesmith 2014-09-11 01:39:12

0

我的解决方案基于Diego的建议使用lib-noir

(ns my-project.handler 
    (:require (compojure [handler :as handler] 
         [route :as route] 
         [core :refer :all]) 
       [ring.util.response :refer [redirect]] 
       [noir.util.middleware :as middleware] 
       [noir.session :as session])) 

(defroutes app-routes 
    (GET "/" [] 
     (session/put! :origin "/") 
     (display-some-html)) 
    (GET "/story" [] 
     (session/put! :origin "/story") 
     (display-more-html)) 
    (GET "/classes" [] 
     (session/put! :origin "/classes") 
     (display-other-html)) 
    (POST "/delete" [id] 
     (delete-some-id-from-db id) 
     (redirect (session/get! :origin "/"))) ; "/" is an optional default 
    (route/resources "/") 
    (route/not-found "Not Found")) 

(def app 
    (-> 
    (handler/site app-routes) 
    session/wrap-noir-session)) 

它的作品,但我不会称它优雅。

+0

你可以写一个中间件,如果你打算重用许多途径来封装会话/放一部分。代码重复可能有三种。此外,您可以将所有表达式放在不同的行中。这将使他们正确缩进没有不必要的代码。 – 2014-09-11 02:57:31

1

使用网址标头重定向回

(let [back (get (:headers request) "referer")] 
    (redirect-to back)) 
0

的建议通过deadghost是最好的一个。在这里,您可以找到我的解决方案,使用lib-noir库自动重定向到您的主页面。我希望这可以帮助别人。

(ns hue-web-app.core 
    (:require [ring.middleware.defaults :refer [wrap-defaults api-  defaults site-defaults]] 
       [ring.util.response :as response]  ;;from ring 
       [compojure.core :refer :all] 
       [compojure.route :as route]    
       [noir.util.middleware :as middleware] 
       [noir.session :as session]] ;;noir for redirect to work 

    (defroutes hue-app-routes 
     (GET "/" [] (session/put! :origin "/") 
        (io/file "resources/testsite.html")) 
     (GET "/turn-off" [] (turn-group-off 3 user) 
          (response/redirect (session/get! :origin "/"))) 
     (GET "/turn-on" [] (turn-group-on 3 user) 
         (response/redirect (session/get! :origin "/")))) 

    ;;STARTING THE SERVER 
    ;;--------------------------------------------------------------  ------------ 
    (defn siteparams 
     [] 
     (run-jetty (-> #'hue-app-routes 
        wrap-reload 
        wrap-restful-format 
        wrap-params 
        session/wrap-noir-session 
        ) 
       {:port 5003 
        :join? false}))