2014-08-29 57 views
1

我一直在Clojure項目工作了一段時間,並想知道如何在點擊提交按鈕後將用戶從一個頁面導航到另一個頁面。 代碼是這樣的:如何將鏈接放在提交按鈕,使用Clojure

(defn view-film-input [] 
(view-layout 
    [:body {:style "background-color: #F2FB78"} 
    [:h2 "Add new film"] 
    (form-to [:post "/addfilm" ] 

    (label "movname" "Film title: ") 
    (text-field :txtname) [:br] 

    (label "prname" "Producer name: ") 
    (text-field :txtprname) [:br] 
    (label "location" "File location: ") 
    (text-field :txtlocation)[:br] 

    (label "duration" "Duration(minutes): ") 
    (text-field :txtduration)[:br] 
    (submit-button "Save"))])) 

現在,這個工作,但我想瀏覽用戶相同的「添加新電影」頁面,或刷新表單之後點擊「保存」按鈕,而不是它顯示只是一個空白頁。

這是GET \ POST部分:

(GET "/addfilm" [] (view-film-input)) 
(POST "/addfilm" [txtname txtprname txtlocation txtduration] 
    (insert-flick txtname txtprname txtlocation txtduration 90)) 

提前感謝!

+0

我認爲這是組合。您的觀點需要返回回覆。什麼'insert-flick'返回? – 2014-08-29 19:26:07

+0

它在另一個管理數據庫的類中定義。使用txtname,txtprname,txtlocation和txtduration作爲屬性添加新電影到表中 – Wombat 2014-08-29 20:27:07

回答

1

這裏有兩種可能性。

用戶重定向

使用HTTP 302(或303)響應的Location頭部可以指定該用戶的瀏覽器應顯示,而不是當前一個的路徑:

(POST "/addfilm" [...] 
    ... 
    {:status 302 
    :headers {"Location" "/addfilm"}}) 

有也是ring.util.response中的兩個函數,它們會爲您生成響應:redirectredirect-after-post - 後者更適用於您的用例。

編輯:This answer闡述了爲什麼303會是狀態代碼POST之後發送,具體是:

如果使用302,你冒着那UA將重新發送POST到新而不是切換到GET。

呈現相同的頁面再次

簡單而促使更少的I/O,但強加一些重複將再次呈現相同的觀點,即:

(POST "/addfilm" [...] 
    ... 
    (view-film-input)) 

這似乎不太對我來說可以維持,但這可能是解決問題的最短路徑。

+0

非常感謝,真正感謝快速響應 – Wombat 2014-08-29 20:30:48