Yesod: использование типов URL-адресов в вызовах AJAX

В моем проекте Yesod у меня есть следующий маршрут:

/api/hide/thread/#Text/#Int      ApiHideThreadR   GET

Я хочу запросить его на стороне клиента с помощью javascript:

function hideThreadCompletely(threadId, board) {
    $.getJSON("/api/hide/thread/"+board+"/"+threadId, function(data) {
        $('#thread-'+threadId).hide();
    });
}

Но я не могу использовать @{ApiHideTHreadR}, потому что Yesod требует его аргументов во время компиляции. Какое правильное решение для этого, если я хочу, чтобы URL-адреса API выглядели как api/board/1/1, а не api/board?bid=1&tid=1? Продолжайте использовать указанный вручную URL-адрес, например "/api/hide/thread/"+board+"/"+threadId?

Ответ 1

После некоторого поиска я нашел этот обсуждение, где предлагается добавить URL-адрес в качестве атрибута "data-url" к некоторому элементу, А затем загрузите url из элемента. Что-то вроде этого:

<div id="thread-1" [email protected]{ApiHideTHreadR}>

var url = $("#thread-1").data("hide-url")

Ответ 2

То, что я всегда делаю, это избавиться от явного параметра, передаваемого в вызове маршрута, и вместо этого заменить его на:

getApiHideThreadR::Handler JSON
getApiHideThreadR = do 
  rawTextParam <- lookupGetParam "text"
  rawThreadId  <- lookupGetParam "table"
  (textParam,threadParam) <- someParseFunction rawTextParam rawThreadId
  ... 

Затем вы можете использовать обычный стиль ajax:

$.getJSON("@{ApiHideThreadR}",{text:"sometext",tabe:"sometable"},success()...

Для более сложного доступа к запросам типа haskell: https://github.com/yesodweb/yesod/wiki/Convert-get-params-into-a-haskell-record

Хороший шаблон.

Ответ 3

Вы не можете использовать безопасный тип для проверки во время компиляции somthing, которое известно только во время выполнения. Я подозреваю, что вы тоже это знаете, но это единственный смысл, который я могу решить из вашего вопроса. Таким образом, ваш единственный вариант делает это вручную.