Yesod, как сгенерировать типобезопасную ссылку из JSON-данных в Javascript / Julius

у меня есть маршрут

/notes/#NoteId    NoteR    GET

С другой страницы я хочу сделать ссылку на нее. При использовании «классического» гамлета это легко:

<a href=@{NoteR $ entityKey note}>notetitle

Я хочу, чтобы моя страница была более динамичной и получала JSON-данные, содержащие информацию о заметке и идентификатор заметки. Как создать правильные и typesafe-ссылки?

У меня уже есть этот код в файле .julius, но он не компилируется, потому что ожидает "NoteId". Я должен вставить obj.id где-нибудь в интерполяции URL @{..}... Есть подсказки, как это сделать?

function loadnotes() {
var list = $("#results");
jQuery.getJSON("@{NotesR}",
    function(o){
        $.each(o, function (i, obj) {
            $('<a href=@{NoteR}/>' + obj.title + '</a>').appendTo(list);
        })});
}
window.onload = loadnotes;

РЕДАКТИРОВАТЬ:

У меня это в Model.hs:

instance ToJSON (Entity Note) where
    toJSON (Entity nid (Note title content created_at updated_at userId)) = object
        [ "id" .= nid
        , "title" .= title
        , "content" .= (unTextarea content)
        , "created_at" .= created_at
        , "updated_at" .= updated_at
        , "userId" .= userId ]

person davidbe    schedule 01.01.2013    source источник
comment
Я плохо разбираюсь в javascript, но, насколько я понимаю, значение note в примере с деревушкой является типизированным значением haskell. Но obj в коде julius — это нетипизированный объект javascript. Имеет ли смысл что-то без известного типа быть частью безопасного URL-адреса?   -  person Tarrasch    schedule 02.01.2013


Ответы (1)


Я бы рекомендовал, чтобы маршрут NotesR возвращал полностью отображаемый URL-адрес, а не только идентификатор заметки.

Изменить: я добавил запись в поваренную книгу, чтобы продемонстрировать этот подход: https://github.com/yesodweb/yesod/wiki/Using-type-safe-urls-from-внутри-javascript

person Michael Snoyman    schedule 02.01.2013
comment
Я понимаю ваш ответ... но как? У меня был экземпляр ToJSON для Entity Note (посмотрите на рассматриваемое редактирование) в Model.hs. Это рекомендуемое место? При добавлении строки для URL-адреса с NoteR nid я получаю сообщение об ошибке, что конструктор данных не находится в области видимости... При перемещении этого кода в файл-обработчик он дает другую ошибку. Что рекомендуется? - person davidbe; 02.01.2013
comment
Я добавил пример кулинарной книги, который, я надеюсь, демонстрирует подход. Дайте мне знать, если у вас есть дополнительные вопросы: github .com/yesodweb/yesod/wiki/ - person Michael Snoyman; 03.01.2013
comment
Спасибо. Это прояснило ситуацию! Я изо всех сил пытался получить правильный URL. Я начал с этого примера: yesodweb.com/blog/2012/ 04/yesod-js-todo (внутри обработчика json не генерируется). Генерация json из внутреннего обработчика имеет больше смысла, когда требуется правильный URL-адрес. - person davidbe; 04.01.2013
comment
Вы все еще можете использовать этот стиль, просто это требует немного больше работы. Один из подходов состоит в том, чтобы сохранить поле Text в вашем типе данных для URL-адреса. Более причудливый подход состоял бы в том, чтобы иметь переменную типа для URL-адресов, а затем fmap с функцией рендеринга для перехода от URL-адресов, безопасных для типов, к текстовым URL-адресам. Но в этом случае, вероятно, имеет смысл просто оставить код в функции-обработчике. - person Michael Snoyman; 04.01.2013