我正在使用Yesod脚手架站点(yesod 1.1.9.2),昨天花了几个小时将我的头顶在Yesy的Fay的基本用法上。我想我现在已经了解了使用Fay向页面添加AJAX功能块的预期工作流程(我在这里有点脚,因为其他人可能会发现逐步的帮助):
将数据构造器Example a
添加到SharedTypes.Command
。
在case readFromFay Command of ...
中的表达式Handler.Fay.onCommand
中,添加一个与我的新数据构造函数匹配的大小写。
在fay / Home.hs之后,在/ fay中创建一个Fay文件“ Example.hs”。在此处的某个位置,使用表达式call (Example "foo") $ myFayCallback
。
为将使用我正在生成的Javascript的页面定义路由和处理程序。在处理程序中,使用$(fayFile' (ConE 'ScriptR) "Example.hs")
。
我的问题:在当前的Yesod / Fay架构中,我应该如何与Fay代码共享我的Persistent模型类型?
在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
projectroot / fay
projectroot / fay-shared
我也尝试在SharedTypes.hs中导入和重新导出Model,但是产生了相同的错误。
有没有办法做到这一点?如果没有,为什么不呢? (我在Haskell和Yesod中都是相对的菜鸟,因此回答“为什么不?”的问题确实很有帮助。)
编辑:
我只是意识到,在此问题的标题中提及“持久性”可能会产生误导。为了更清楚地说明我要执行的操作:我只想能够使用Yesod为我的模型定义的相同数据类型来表示Fay代码中的数据。例如。如果我在config / models中定义一个模型...
Foo
bar BarId
textThatCanBeNull Text Maybe
deriving Show
...我希望能够定义一个AJAX“命令”,该命令接收和/或返回类型为
Foo
的值,并使我的Fay代码以Foo
处理,而无需编写任何反序列化代码。我了解我将无法直接从我的Fay代码中使用Persistent的任何查询功能;我只在标题中提到了Persistent,因为我在精神上将Model.hs和config / models中的所有内容与Persistent关联。 最佳答案
当前不支持此功能; Perytent有很多Fay不支持的功能(例如Template Haskell)。就目前而言,拥有一个由Fay和Yesod共享的中间数据类型并将您的Persistent数据与该类型进行相互转换可能是有意义的。