Erlang erlydtl呈现mnesia记录

时间:2011-11-04 20:30:05

标签: erlang

我有以下记录定义:

-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).

以上显然不起作用。 救命啊!

谢谢。

-

2 个答案:

答案 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/2record_to_proplist/3,效果很好。对于您传入的记录,这些也是动态的。