Как получить доступ к отдельным полям формы в Clojure?

Я создаю свое самое первое веб-приложение, и мне трудно получить доступ к отдельным полям формы, когда пользователь submits форму. Вот что у меня есть:

(defroutes app
  (GET "/" [] homepage)
  (POST "/city" request display-city)
  (route/resources "/")
  (route/not-found "Not Found"))


(defn display-city [request]
  (html5
     [:div {:class "the-city"}
      [:h2 "ALL ABOUT YOUR CITY"]
      [:ul
       [:li "Your city is " (str request) "! That's all"]]]))

;; and here's the hiccup form:
   [:form {:action "/city" :method "post"}
    (anti-forgery-field)
    [:p "Enter your home address"]
    [:div
     [:label {:for "street-field"} "Street:"]
     [:input {:id "street-field"
              :type "text"
              :name "street"}]]
    [:div
     [:label {:for "city-field"} "City:"]
     [:input {:id "city-field"
              :type "text"
              :name "city"}]
    [:div
     [:label {:for "state-field"} "State:"]
     [:input {:id "state-field"
              :type "text"
              :name "state"}]
     [:label {:for "zip-field"} "ZIP:"]
     [:input {:id "zip-field"
              :type "text"
              :name "zip"
              :size "10"}]]
    [:div.button
     [:button {:type "submit"} "Submit"]]]])

;; Когда я запускаю приведенный выше код, я вижу всю форму, отправленную через (str request), в том, что выглядит как карта Clojure. Но я не могу понять, как извлечь отдельные «ключи/значения» (из этой адресной формы я хотел бы извлечь город) или как сохранить эти результаты таким образом, чтобы я мог их использовать. Любые идеи?

Это очень простая /city страница, которую я пытаюсь запустить, чтобы понять, как все работает, прежде чем создавать более крупные вещи. Спасибо!


person orangeorangepeel    schedule 08.05.2018    source источник
comment
Я не понимаю вопроса. Что такое город? Пожалуйста, покажите пример входных данных, выходных данных, что вы пробовали и что получилось.   -  person Alan Thompson    schedule 08.05.2018


Ответы (1)


В вашей карте request должен быть ключ :form-params с картой пар ключ/значение, которые были отправлены POST. Вот как вы можете получить отдельное значение:

(get-in request [:form-params :city])

Или вы можете деструктурировать карту :form-params, чтобы связать сразу несколько значений:

(let [{:keys [city state zip]} (:form-params request)]
  (format "%s, %s %s" city state zip))
person Taylor Wood    schedule 08.05.2018
comment
Благодарю вас! Когда я использую форму (get-in), она говорит мне, что это: Unable to resolve symbol: param-city in this context внутри предложения let. Можете ли вы сказать, что я делаю неправильно? (let [param-city (запрос на вход [:form-params :city] .....)] - person orangeorangepeel; 08.05.2018
comment
хм, он возвращает пустую строку, знаете ли вы, что может быть причиной? - person orangeorangepeel; 08.05.2018