#lisp #clojure
Здравствуйте! Ещё в самом начале изучения Clojure. Подскажите пожалуйста.
У меня есть clojure-проект. Я использую шаблонизатор hiccup и стили Bootstrap. Всё
работает. Но вот только не понимаю как работают условные операторы в моём случае.
Вот мой код:
Файл project.clj:
(defproject yupppie "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "ссылка (ссылка словом потому что не позволяет репутация вставлять)"
:license {:name "Eclipse Public License"
:url "ссылка"}
:dependencies [[org.clojure/clojure "1.7.0"]
[ring "1.4.0"]
[compojure "1.4.0"]
[hiccup "1.0.5"]]
:plugins [[lein-ring "0.9.7"]]
:ring {:handler yupppie.core/app})
Файл yupppie.core:
(ns yupppie.core
(:require [compojure.core :refer :all]
[compojure.route :as route]
[ring.middleware.params :refer [wrap-params]]
[clojure.pprint :refer :all]
[hiccup.core :refer :all]
[hiccup.page :refer [include-css include-js]]))
(defn home []
(html
[:head (include-css "/bootstrap-3.3.6-dist/css/bootstrap.min.css")
(include-css "/styles.css")
(include-css "https://fonts.googleapis.com/icon?family=Material+Icons")
(include-js "/bootstrap-3.3.6-dist/js/bootstrap.min.js")]
[:body
[:div {:class "col-lg-6"}
[:div {:class "input-group"}
[:input {:type "text" :class "form-control" :placeholder "How old are you?"}
[:span {:class "input-group-btn"}
[:button {:class "btn btn-default" :type=" button"} "Go, baby!"]]]]]]))
;
(defroutes app
(route/resources "/")
(GET "/" [] (home))
(POST "/saveform" req
(with-out-str (clojure.pprint/pprint (:params req)))))
(def apps
(wrap-params app))
Я стал изучать его недавно, так что пока не очень понимаю.
У меня есть простая форма. И при вводе в поле цифры меньше 18 и нажатии на кнопку,
нужно сделать так чтобы показывалась одна картинка, а при вводе цифры 18 или больше
другая картинка. Вот как мне использовать условный оператор if, чтобы это заработало?
Куда вставлять код и что писать?
Ответы
Ответ 1
Рассчитываю, что вы разберётесь, как прислать значение в форме. Я предположу, что с этим вы разобрались и в параметрах к запросу прилетает нужное значение. Предположу, что строка с присланным числом доступна в параметрах под ключом age и потому может быть забиндена в Compojure, как: (POST "/" [age] ???) Там строка. Нам надо число. Можно не изобретать велосипедов и затянуть функцию as-int из compojure.coercions. Правда, потребуется чуть-чуть изменить описание метода: (POST "/" [age :<< as-int] ???) Альтернативы? В них нет необходимости, реализация as-int предельно проста: (try (Long/parseLong s) (catch NumberFormatException _ nil)) Не видя её исходников ранее, я попытался написать код преобразования сам. Единственным отличием от as-int оказалось использование Integer/parseInt. И оно было ошибочным! Теперь считаем, достаточно ли юзер стар, и сообщаем об этом в шаблон (let [old-enough? (and (-> age nil? not) ; если число не распарсилось, придёт nil (< 18 age))] (функция-шаблончик old-enough?)) В шаблончике... ну, просто берёте и вместо одного из узлов DOM кладёте if. (defn функция-шаблончик [old-enough?] (html [:body (if old-enough? "YEAH" "NOPE")])) Примеры, конечно, совершенно примитивные. Но вы же можете их развить, верно? :)
Комментариев нет:
Отправить комментарий