Yesod:julius模板中的参数处理程序

时间:2016-03-02 19:08:43

标签: templates haskell handler yesod

我是Yesod的新手,目前正在尝试开发一个前端网站和一个后端的宁静网络服务。要从网站访问API,我使用AJAX请求。对于请求的URL,我想使用莎士比亚模板,如调用:

$.ajax({
  url: '@{PersonR}',
  type: 'GET',
  contentType: "application/json",
  data: JSON.stringify({...}),
  success: function (data) {...}
});

在后端站点上,我的PersonR处理程序的路由定义如下:

/api/person/#Int/get PersonR GET

为此,处理程序具有类似

的签名
getPersonR :: Int -> Handler Value

但是现在julius模板需要一个参数才有效。我进行了一些实验,发现我可以在@ {...}中直接使用haskell代码。也许我在doku中错过了这一点。 问题1:有没有办法告诉其中一个参数可以在JavaScript中给出?也许用渲染器输出这样的东西:

function(var1){return '/api/person/'+var1+'/get';}

我认为这缺乏类型安全的观点。这导致了我的第二个问题(这有点否定了第一个问题):有没有其他方法可以将数据导入到客户端的URL中?

1 个答案:

答案 0 :(得分:1)

我没有太多使用这个包,但是yesod-js-routes似乎符合要求。基本上,包接收您的路由文件并生成可用于创建URL的Javascript函数。

该软件包暂时没有看到活跃的开发,但基于测试它仍然可以正常工作。它不是Hackage,而是一个文件,所以我只是将它复制到我的项目中(我还需要将import Prelude添加到该文件中,并将mtl添加到Cabal文件的build-depends部分)。该项目的自述文件涵盖了您需要执行的软件包的基本集成。

这是一些示例输出。对于此路线文件:

/static StaticR Static appStatic
/auth   AuthR   Auth   getAuth

/favicon.ico FaviconR GET
/robots.txt RobotsR GET

/ HomeR GET POST

/comments CommentR POST
/jsRoutes JSRoutesR GET
/test/#Text/#Integer TestR GET POST

我有这个Javascript:

;
var jsRoutes = {}; /* Subsite not supported */ ; /* Subsite not supported */ ;
jsRoutes.FaviconR = {
    get: function() {
        return {
            method: "get",
            url: "/favicon.ico/"
        };
    }
};
jsRoutes.RobotsR = {
    get: function() {
        return {
            method: "get",
            url: "/robots.txt/"
        };
    }
};
jsRoutes.HomeR = {
    get: function() {
        return {
            method: "get",
            url: "/"
        };
    },
    post: function() {
        return {
            method: "post",
            url: "/"
        };
    }
};
jsRoutes.CommentR = {
    post: function() {
        return {
            method: "post",
            url: "/comments/"
        };
    }
};
jsRoutes.JSRoutesR = {
    get: function() {
        return {
            method: "get",
            url: "/jsRoutes/"
        };
    }
};
jsRoutes.TestR = {
    get: function() {
        return {
            method: "get",
            url: "/test/" + arguments[0] + "/" + arguments[1] + "/"
        };
    },
    post: function() {
        return {
            method: "post",
            url: "/test/" + arguments[0] + "/" + arguments[1] + "/"
        };
    }
};

对于TestR这样的路线,您可以致电:

jsRoutes.TestR.get("a",2).url

返回

"/test/a/2/"

不幸的是,生成的Javascript和Javascript语言都没有采取任何措施来防范,例如将3个参数传递给该函数,或传递错误类型的参数。我不知道您的期望是什么,但Javascript代码生成看起来很简单,您可以改进生成的内容。