Как поместить ссылку в кнопку отправки, используя 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) )
Заранее спасибо!
1 ответ
У вас есть две возможности здесь.
Перенаправить пользователя
С использованием Location
заголовок ответа HTTP 302 (или 303), вы можете указать путь, который браузер пользователя должен отображать вместо текущего:
(POST "/addfilm" [...]
...
{:status 302
:headers {"Location" "/addfilm"}})
Есть также две функции в ring.util.response
это будет генерировать ответы для вас: redirect
а также redirect-after-post
- последнее более применимо к вашему варианту использования.
РЕДАКТИРОВАТЬ: В этом ответе уточняется, почему 303 будет код состояния для отправки после POST, а именно:
Если вы используете 302, вы рискуете, что UA повторно отправит POST на новый URL вместо того, чтобы переключиться на GET.
Рендеринг той же страницы снова
Проще и требует меньше операций ввода-вывода, но наложит некоторое дублирование, чтобы снова отобразить то же представление, то есть:
(POST "/addfilm" [...]
...
(view-film-input))
Это кажется мне менее понятным, но это, вероятно, самый короткий путь к решению вашей проблемы.