Fay 代码中的持久模型类型
Posted
技术标签:
【中文标题】Fay 代码中的持久模型类型【英文标题】:Persistent model types in Fay code 【发布时间】:2013-03-29 17:34:43 【问题描述】:我正在使用 Yesod 脚手架站点(yesod 1.1.9.2),昨天花了几个小时来了解 Fay 和 Yesod 的基本用法。我想我现在了解了使用 Fay 向页面添加大量 AJAX 功能的预期工作流程(在这里我会有点迂腐,因为其他人可能会觉得逐步进行有帮助):
将数据构造函数Example a
添加到SharedTypes.Command
。
在Handler.Fay.onCommand
中的表达式case readFromFay Command of ...
中,添加与我的新数据构造函数匹配的大小写。
在 /fay 中创建一个 Fay 文件“Example.hs”,以 fay/Home.hs 为模板。在这里的某个地方,使用表达式call (Example "foo") $ myFayCallback
。
为将使用我生成的 javascript 的页面定义路由和处理程序。在处理程序中,使用$(fayFile' (ConE 'ScriptR) "Example.hs")
。
我的问题:在当前的 Yesod/Fay 架构中,我应该如何与我的 Fay 代码共享我的 Persistent 模型类型?
在 Fay 文件中使用 import Model
不起作用 - 当我尝试加载使用此 Fay 文件的页面时,我在浏览器中收到错误(我猜是 Fay 提醒我错误的标准方式)表示它找不到模块“模型”,但它只搜索了以下目录:
我也尝试在 SharedTypes.hs 中导入和重新导出模型,但产生了同样的错误。
有没有办法做到这一点?如果不是,为什么不呢? (我是 Haskell 和 Yesod 的相对菜鸟,所以回答“为什么不呢?”这个问题真的很有帮助。)
编辑:
我刚刚意识到在这个问题的标题中提到 Persistent 可能会产生误导。为了更清楚我想要做什么:我只想能够使用 Yesod 为我的模型定义的相同数据类型在我的 Fay 代码中表示数据。例如。如果我因此在 config/models 中定义模型...
Foo
bar BarId
textThatCanBeNull Text Maybe
deriving Show
...我希望能够定义一个接收和/或返回Foo
类型值的 AJAX“命令”,并让我的 Fay 代码在 Foo
s 中处理,而无需我编写任何 de/序列化代码。我知道我将无法直接从我的 Fay 代码中使用 Persistent 的任何查询功能;我只在标题中提到了 Persistent,因为我将 Model.hs 和 config/models 中的所有内容都与 Persistent 联系在一起。
【问题讨论】:
【参考方案1】:目前不支持; Persistent 利用了许多 Fay 不支持的功能(例如 Template Haskell)。目前,拥有一个由 Fay 和 Yesod 共享的中间数据类型并将您的 Persistent 数据转换为/从该类型转换可能是有意义的。
【讨论】:
无赖,但感谢您的回答!你认为 Fay 是否有可能在不久的将来(比如 6-12 个月)进行扩展,以支持相关的 Haskell 功能?和/或您是否有任何计划调整 Persistent 以便我们的模型类型(甚至是 Persistent 为每个模型生成的许多类型的一些有用子集)可以在 Fay 代码中使用,尽管 Fay 的语言功能支持有限?我注意到'postgres-fay' 现在是yesod init
脚本中的一个选项;看来你一定是在做某事……还是我误解了?
有计划让 Yesod+Fay 的使用更容易,但在这个特定方向上没有任何进展。我实际上在 fpcomplete.com 中广泛使用 Fay,但主要遵循我在这里给出的建议。它实际上在大多数情况下都非常有效,因为模型中通常会有一些您不希望客户端访问的数据。
我同意@MichaelSnoyman 的观点,单独的类型通常是有意义的。当然,如果能够共享这些类型以加快原型制作,那将是一件好事。我们目前正在考虑将 Fay 迁移到完整的 haskell-suite 或 GHC API。在这一点上,我们已经尽可能多地使用了 haskell-src-exts。如果我们选择 Haskell 套件,这将取决于它们何时准备好发布,我将在本周末与 Roman 讨论他们的进展。不管怎样,我不确定是否可以只使用 Fay 中的持久模型,我们稍后再讨论!
谢谢亚当。对这个方向有额外的洞察力感觉非常有帮助。以上是关于Fay 代码中的持久模型类型的主要内容,如果未能解决你的问题,请参考以下文章