我有以下记录定义:
-record(contact, {name, email})
假设我已经在mnesia数据库中有几个联系人,并且我想在html页面上使用erlydtl呈现它们,我首先查询数据库:
F = fun() -> qlc:e(qlc:q([X || X <- mnesia:table(contact)])) end,
{atomic, Contacts} = mnesia:transaction(F).
将我的联系人存储在Contacts变量中,并且有一个contacts.html文件,我尝试将其渲染(下面的代码发生在misultin回调中):
F = fun() -> qlc:e(qlc:q([X || X <- mnesia:table(contact)])) end,
contacts.html文件如下:
{atomic, Contacts} = mnesia:transaction(F).
以上显然不起作用。 救命啊!
谢谢。
-
答案 0 :(得分:3)
我希望有一个更好的解决方案,但你可以定义一个辅助函数,如:
contact_to_list(C) ->
lists:zip(record_info(fields, contact), tl(tuple_to_list(C))).
并将其传递给ErlyDTL:
your_template:render([{contact, contact_to_list(C)}]).
UPDATE :如果你想让这个'动态',以便你可以将一个变量而不是一个原子传递给record_info,你可以使用'exprecs'解析变换:
http://doc.erlagner.org/parse_trans/exprecs.html
基本上,在将parse_trans应用程序添加为依赖项后,您可以将以下内容添加到模块中:
-compile({parse_transform, exprecs}).
-export_records([
contact
]).
然后拥有新的动态功能:
record_to_list(Rec, RecName) ->
lists:zip('#info-'(RecName), tl(tuple_to_list(Rec))).
答案 1 :(得分:2)
mochiweb_util提供了record_to_proplist/2
和record_to_proplist/3
,效果很好。对于您传入的记录,这些也是动态的。