Как поместить ссылку в кнопку отправки, используя 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))

Это кажется мне менее понятным, но это, вероятно, самый короткий путь к решению вашей проблемы.

Другие вопросы по тегам