我正在使用 Yesod 脚手架站点(yesod 1.1.9.2),昨天花了几个小时来了解 Fay 和 Yesod 的基本用法。我想我现在了解了使用 Fay 向页面添加大量 AJAX 功能的预期工作流程(我在这里会有点迂腐,因为其他人可能会发现逐步的帮助):
- 将数据构造函数添加
Example a
到SharedTypes.Command
. - 在 中的表达式
case readFromFay Command of ...
中Handler.Fay.onCommand
,添加一个与我的新数据构造函数匹配的案例。 - 在 /fay 中创建一个 Fay 文件“Example.hs”,以 fay/Home.hs 为模板。在这里的某个地方,使用表达式
call (Example "foo") $ myFayCallback
。 - 为将使用我正在生成的 Javascript 的页面定义一个路由和处理程序。在处理程序中,使用
$(fayFile' (ConE 'ScriptR) "Example.hs")
.
我的问题:在当前的 Yesod/Fay 架构中,我应该如何与我的 Fay 代码共享我的持久模型类型?
在 Fay 文件中使用import Model
不起作用 - 当我尝试加载使用此 Fay 文件的页面时,我在浏览器中收到错误(我猜是 Fay 提醒我错误的标准方式),表明它不能找到模块“模型”,但它只搜索了以下目录:
- projectroot/cabal-dev//share/fay-0.14.2.0/src
- projectroot/cabal-dev/share/fay-base-0.14.2.0/src
- projectroot/cabal-dev/share/fay-base-0.14.2.0
- 项目根/fay
- projectroot/fay-shared
我还尝试在 SharedTypes.hs 中导入和重新导出模型,但这产生了相同的错误。
有没有办法做到这一点?如果不是,为什么不呢?(我是 Haskell 和 Yesod 的相对菜鸟,所以回答“为什么不呢?”这个问题真的很有帮助。)
编辑:
我刚刚意识到在这个问题的标题中提到 Persistent 可能会产生误导。为了更清楚我想要做什么:我只想能够使用 Yesod 为我的模型定义的相同数据类型在我的 Fay 代码中表示数据。例如,如果我在 config/models 中定义了一个模型......
Foo
bar BarId
textThatCanBeNull Text Maybe
deriving Show
...我希望能够定义一个接收和/或返回类型值的 AJAX“命令”,Foo
并让我的 Fay 代码在Foo
s 中处理,而无需编写任何反序列化代码。我知道我将无法直接从我的 Fay 代码中使用 Persistent 的任何查询功能;我只在标题中提到了 Persistent,因为我将 Model.hs 和 config/models 中的所有内容都与 Persistent 联系在一起。