Перенаправление работает, но не изменяет URL-адрес в IHP

#haskell #ihp

Вопрос:

Контекст

У меня есть 2 контроллера:

  • LessonsController (с индексом представлений и отображением)
  • QuizAnswersController (без просмотров)

В соответствии с сгенерированным кодом контроллера, в LessonsController ShowLessonAction рендерах ShowView .

В ShowView , у меня есть ссылка на действие в QuizAnswersController :

 <a href={CheckQuizAnswerAction (get #id answer)}>Check Answer</a>
 

CheckQuizAnswerAction проверяет, правильный ли ответ, а затем перенаправляет на ShowLessonAction сообщение с сообщением об успешном выполнении:

 action CheckQuizAnswerAction { quizAnswerId } = do
    quizAnswer <- fetch quizAnswerId
    quiz <- fetch (get #quizId quizAnswer)
    let lessonId = get #lessonId quiz

    case (get #correct quizAnswer) of
        True -> setSuccessMessage "Correct!" >> redirectTo ShowLessonAction { lessonId }
        False -> setSuccessMessage "Try again" >> redirectTo ShowLessonAction { lessonId  }
 

Вопрос

Все работает, но я заметил, что после CheckQuizAnswerAction вызова URL-адрес:

/CheckQuizAnswer?quizAnswerId=123…

вместо:

/Без шоу?LessonID=123…

Что происходит, чтобы заставить это работать с другим URL-адресом?

Ответ №1:

Поскольку ваше действие вызывает побочный эффект, лучше всего использовать форму здесь:

 <form method="POST" action={CheckQuizAnswerAction (get #id answer)}>
    <button type="submit" class="btn btn-link">Check Answer</button>
</form>
 

Использование этого вместо <a href={CheckQuizAnswerAction (get #id answer)}>Check Answer</a> того, чтобы уже могло решить проблему 🙂