2014-08-29 54 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