【问题标题】:More readable Compojure routes更具可读性的 Compojure 路线
【发布时间】:2014-10-16 06:57:45
【问题描述】:

我正在开发一个小型 Ring / Compojure webapp,我想知道是否有办法整理路线。我正在使用标准的 Clojure 解构,但需要相当多的参数传递给函数。

这没关系,使用 Compojure Compojure 特定的解构:

(POST "/login/" [email password] (login-post email password)) ; handle login attempt

现在情况开始变得更糟。我需要为该函数提供存储在会话中的闪存消息和电子邮件:

(GET "/login/" {flash :flash {email :email} :session} (login-get flash email))

以下是通过表单提交数据的途径:

(POST "/" {{user-email :user-email} :session {title :title} :params {tags :tags} :params { content :content } :params { privacy :privacy } :params} (home-post user-email title tags content privacy))

我知道我可以使用 :params 将原始请求发送到然后 home-post 函数,但我不知何故觉得将参数提取与路由放在一起是一个更好的解决方案。它使 home-post 更纯净,更容易测试。只为每个函数提供一个巨大的请求映射。

路线定义中的解构可以更清晰(更易读),使用某种从地图中提取的函数,宏,什么的?

将解构与路线一起放置的优点和缺点?

【问题讨论】:

    标签: clojure routes compojure ring


    【解决方案1】:

    首先,我同意您的评估,即请求解构通常属于路由处理程序定义。 Compojure 提供an extension of Clojure's destructuring syntax 的事实似乎表明作者也有类似的感受。

    您可以采取一些措施来减少解构表单中的重复。首先,Clojure 的标准 map binding destructuring 将有助于您发布的最后一条路线。您可以做的第一件事是整合您从请求 :params 中提取的密钥:

    (POST "/" {{title :title, tags :tags, content :content, privacy :privacy} :params ...} ...)
    

    这更清楚一点,但由于您没有重命名从:params 中提取的任何值,因此您可以做得更好:

    (POST "/" {{:keys [title tags content privacy]} :params ...} ...)
    

    这大约是 Clojure 解构语法所能达到的范围,但您可以利用 Compojure 的额外解构语法来进一步干燥它。 Compojure 假设您通常对从请求的 :params 键中获取值感兴趣,因此您可以使用向量解构将它们提取出来:

    (POST "/" [title tags content privacy] ...)
    

    好多了。由于您仍然需要从请求中获取其他值,因此您可以在绑定向量的末尾提供 :as the-request 以直接访问请求:

    (POST "/" [title tags content privacy :as req] ...)
    

    但是请记住,这个变量可以被解构。考虑到所有这些,这里是您最后一条路线的简化版本:

    (POST "/" [title tags content privacy :as {{user-email :user-email} :session}]
      (home-post user-email title tags content privacy))
    

    我希望这会有所帮助!您编写的 Clojure 越多,您就越能找到简化代码以使其更清晰、更简洁的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 2015-12-14
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      相关资源
      最近更新 更多