Erlydtl:有没有一种方法可以渲染模板中的记录列表?

唐·利诺

例如,我有:

-record(usr,{name,email}).
...
Usr1 = #usr{name="John", email="[email protected]"},
Usr2 = #usr{name="Jane", email="[email protected]"},
Usr3 = #usr{name="Alex", email="[email protected]"},
{ok, Result} = template_dtl:render([{users, [Usr1, Usr2, Usr3]}]),
...

我想像这样使用它:

{% block content %}
{% for user in users %}
<a href="mailto:{{user.email}}">Send mail to {{user.name}}</a>
{% endfor %}
{% endblock %}

有人遇到过同样的问题吗?

保罗·盖奥特

记录是元组之上的语法糖Usr1Usr2Usr3只是元组,而恰恰是:

Usr1 = {usr, "John", "[email protected]"},
Usr2 = {usr, "Jane", "[email protected]"},
Usr3 = {usr, "Alex", "[email protected]"}.

该模板不知道如何解释这些记录,因为它不知道在编译时的记录定义。

有三种解决方案来解决您的问题。在所有情况下,模板都是相同的,您应该像以前那样编写user.email编写user.name

教erlydtl有关您的记录

record_info 编译选项的确切含义是告诉erlydtl有关模板变量中使用的记录。

erlydtl:compile_template(Template, TemplateModuleName, [{record_info, [{usr, record_info(fields, usr)}]).

缺点是您可能不会自称erlydtl:compile*,因此添加record_info选项可能会很困难。此外,调用此函数的代码段必须知道您可能必须移至.hrl文件的记录定义

将您的记录转换为dict:dict(),proplist()或gb_trees:tree()

这就是坎贝尔汤在其评论中所建议的。您也可以record_info/2为此使用编译时函数实际上,最简单的proplist()形式是:

lists:zip(record_info(fields, usr), tl(tuple_to_list(Usr1))).

tuple_to_list(Usr1)评估为[usr, "John", "[email protected]"],而record_info(fields, usr)等于[name, email]

将数据封装在模块中

记录对于使用公共访问器(user.name捕获数据结构并不是很好,因为记录可以更好地在给定模块的本地维护,因为这使代码更新变得更加容易。或者,您可以定义一个将导出访问的模块(称为usrapp_useruser存在的模块)name/1email/1

这里的Erlydtl魔术基于先前称为参数化模块的功能,更确切地说,是基于使用元组而不是原子作为模块名称来调用函数的功能。您实际上并不需要参数化的模块,只需传递与现有模块匹配的元组即可。

例如,您的app_user模块可能如下所示:

-module(app_user).
-export([new/2, name/1, email/1]).
-record(?MODULE, {name :: string(), email :: string()}). % private to this module.
-type app_user() :: #?MODULE{}.

-spec new(string(), string()) -> app_user().
new(Name, Email) -> #?MODULE{name = Name, email = Email}.

-spec name(app_user()) -> string().
name(#?MODULE{name = Name}) -> Name.

-spec email(app_user()) -> string().
email(#?MODULE{email = Email}) -> Email.

?MODULE之所以使用它,是app_user因为它仅在记录的名称与模块的名称匹配时才起作用,并且即使重命名模块,该代码也将起作用)。

然后,在您的代码中,而不是:

Usr1 = #usr{name = "John", email = "[email protected]"}

你会这样写:

Usr1 = app_user:new("John", "[email protected]").

Usr1只是一条记录,或更确切地说是元组:

{app_user, "John", "[email protected]"}.

尽管如此,Erlydtl仍将能够Usr1直接进行处理它将被视为参数化模块,作为模块app_user存在(这是上面的模块)。因此,在模板呈现期间,它将调用app_user:name/1app_user:email/1访问器函数,并向它们传递整个记录。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Erlydtl:有没有一种方法可以渲染模板中的记录列表?

来自分类Dev

有没有一种方法可以在PHPStorm中快速预览/实时模板列表?

来自分类Dev

有没有一种方法可以在表的模板变量中执行html?

来自分类Dev

有没有一种方法可以刷新VSCode中的任务列表?

来自分类Dev

有没有一种方法可以合并R中的回归摘要列表?

来自分类Dev

有没有一种方法可以计算javascript中的聚会列表?

来自分类Dev

有没有一种方法可以为Django中的所有模板指定默认的基本模板?

来自分类Dev

有没有一种方法可以为Django中的所有模板指定默认的基础模板?

来自分类Dev

有没有一种方法可以记录所有DOM方法调用

来自分类Dev

有没有一种方法可以在DocPad中从“ src”外部包含/渲染文件?

来自分类Dev

Python模板,有没有一种方法可以从多个html文件继承?

来自分类Dev

有没有一种方法可以为模板函数声明类型名?

来自分类Dev

有没有一种方法可以获取模板提供的大小?

来自分类Dev

Python模板,有没有一种方法可以从多个html文件继承?

来自分类Dev

有没有一种方法可以设置javascript的日志记录阈值

来自分类Dev

有没有一种方法可以排除项目被记录?

来自分类Dev

有没有一种方法可以将变量传递给Django中的“扩展”模板?

来自分类Dev

有没有一种方法可以根据流星中的用户角色附加模板事件?

来自分类Dev

有没有一种方法可以使用mixin或模板从D中的类生成接口?

来自分类Dev

有没有一种方法可以简化模板中Flask WTForms错误的代码

来自分类Dev

angular2中有没有一种方法可以根据设备选择模板

来自分类Dev

有没有一种方法可以转储“ self”或symfony树枝模板中的容器对象?

来自分类Dev

有没有一种方法可以在tkinter标签中打印列表列表?

来自分类Dev

有没有一种方法可以使有序列表中的数字加粗?

来自分类Dev

有没有一种方法可以将bash中的历史记录列表的大小设置为5000行以上?

来自分类Dev

有没有一种方法可以“遍历列表”?

来自分类Dev

有没有一种方法可以将列表理解重写为for循环?

来自分类常见问题

有没有一种方法可以衡量列表的排序方式?

来自分类Dev

有没有一种方法可以通过索引合并多个列表索引?

Related 相关文章

  1. 1

    Erlydtl:有没有一种方法可以渲染模板中的记录列表?

  2. 2

    有没有一种方法可以在PHPStorm中快速预览/实时模板列表?

  3. 3

    有没有一种方法可以在表的模板变量中执行html?

  4. 4

    有没有一种方法可以刷新VSCode中的任务列表?

  5. 5

    有没有一种方法可以合并R中的回归摘要列表?

  6. 6

    有没有一种方法可以计算javascript中的聚会列表?

  7. 7

    有没有一种方法可以为Django中的所有模板指定默认的基本模板?

  8. 8

    有没有一种方法可以为Django中的所有模板指定默认的基础模板?

  9. 9

    有没有一种方法可以记录所有DOM方法调用

  10. 10

    有没有一种方法可以在DocPad中从“ src”外部包含/渲染文件?

  11. 11

    Python模板,有没有一种方法可以从多个html文件继承?

  12. 12

    有没有一种方法可以为模板函数声明类型名?

  13. 13

    有没有一种方法可以获取模板提供的大小?

  14. 14

    Python模板,有没有一种方法可以从多个html文件继承?

  15. 15

    有没有一种方法可以设置javascript的日志记录阈值

  16. 16

    有没有一种方法可以排除项目被记录?

  17. 17

    有没有一种方法可以将变量传递给Django中的“扩展”模板?

  18. 18

    有没有一种方法可以根据流星中的用户角色附加模板事件?

  19. 19

    有没有一种方法可以使用mixin或模板从D中的类生成接口?

  20. 20

    有没有一种方法可以简化模板中Flask WTForms错误的代码

  21. 21

    angular2中有没有一种方法可以根据设备选择模板

  22. 22

    有没有一种方法可以转储“ self”或symfony树枝模板中的容器对象?

  23. 23

    有没有一种方法可以在tkinter标签中打印列表列表?

  24. 24

    有没有一种方法可以使有序列表中的数字加粗?

  25. 25

    有没有一种方法可以将bash中的历史记录列表的大小设置为5000行以上?

  26. 26

    有没有一种方法可以“遍历列表”?

  27. 27

    有没有一种方法可以将列表理解重写为for循环?

  28. 28

    有没有一种方法可以衡量列表的排序方式?

  29. 29

    有没有一种方法可以通过索引合并多个列表索引?

热门标签

归档