使用yesod附带的hamlet模板语言,打印逗号分隔列表的最佳方法是什么?
假设这个代码只打印一个接一个的条目,如何在元素之间插入逗号?或者甚至可能在最后一个条目之前添加"和":
The values in the list are
$ forall entry <- list
#{entry}
and that is it.
Run Code Online (Sandbox Code Playgroud)
一些模板语言(如Template Toolkit)提供了检测第一次或最后一次迭代的指令.
这并不是说难写的生成类型的toJSON/FromJSON情况,但仍然,当你生成代码,你可以扔在?或者有一种简单的方法可以让这种情况成为Yesod用户吗?(我没有深入研究TH是如何工作的......)
更新: 好的,我喜欢这个建议但是,说我的持久类型是用户.如果我使用
$(deriveJSON id ''User)
Run Code Online (Sandbox Code Playgroud)
它产生了
Exception when trying to run compile-time code:
Data.Aeson.TH.withType: Unsupported type: TySynD Model.User [] (AppT (ConT Model.UserGeneric) (ConT Database.Persist.GenericSql.Raw.SqlPersist))
Code: deriveJSON (id) 'User
Run Code Online (Sandbox Code Playgroud)
显然是因为它是别名.但
$(deriveJSON id ''UserGeneric)
Run Code Online (Sandbox Code Playgroud)
产量
Kind mis-match
The first argument of `UserGeneric' should have kind `(* -> *)
-> *
-> *',
but `backend[i5XB]' has kind `*'
Run Code Online (Sandbox Code Playgroud)
我可能仍然有错误的类型,但我找不到Persistent生成什么来获得正确的咒语.
这是一个非常简单的问题:如何运行可以同时处理多个主机的Yesod应用程序?
默认的Yesod设置可以处理来自任何主机的传入连接,但所有URL都会approot在它们前面进行渲染.joinPath如果存在一种存储当前域的方式以便该函数可用,那么覆盖Yesod实例声明是可能的,但是没有.
这个维基页面上描述的方法有效,但是非常hackish,因为它强制路由采取额外的domain参数(因为我没有一组静态的域匹配).出于实际目的(因为我有很多路由,其中一些是与域无关的),最好有一个解决方案使路由不受影响,因为仍然可以从WAI请求信息中获取主机名.处理函数.
我使用需要绝对URL的东西(例如电子邮件,RSS,XML API),因此approot _ = ""不是一种选择.
我不能也不能在编译时知道需要支持的所有主机名.
那么,如何呈现URL以便它们使用传入请求的主机名,而不是approot变量?
我需要创建一个包含可编辑列的表.每行都是一个单独的记录.我希望能够显示数百条记录,对它们执行编辑,然后将它们提交回服务器进行更新.我不确定表单基础结构是否真的支持它.
有没有办法制作一个可重复的形式,以便我得到一个结果列表?这似乎是我能想象的最接近的解决方案,而无需在javascript中编写自己的解决方案.任何关于此的想法都会受到欢迎.
我正在尝试设置一个授权方案,我检查1.用户登录2.用户可以访问某个对象.为此,我首先调用maybeAuthId,然后尝试获取当前对象,并"加入"另一个列出权限的表.有两个级别的可能案例和一个级别的空列表案例.我想过使用MaybeT,但要么我太累了要让它工作,要么"不是真正的monad变换器"-handler-transformers不能和MaybeT一起使用.有没有一种很好的方式来处理深深的maybes?
编辑:
看起来我有点不清楚.我的意思是我有这样的事情:
case foo of
Nothing -> something
Just foo' -> do
bar <- somethingelse
case bar of
Nothing -> ...
Just bar' -> ...
Run Code Online (Sandbox Code Playgroud) 如何使用不同数量的输入字段动态生成表单?
我管理的最接近的是:
listEditForm :: [String] -> Html -> MForm App App (FormResult Text, Widget)
listEditForm xs = renderDivs $ mconcat [ areq textField (String.fromString x) Nothing | x <- xs]
Run Code Online (Sandbox Code Playgroud)
但是这有结果类型Text而不是[Text]预期的,由于它Text是一个实例的巧合Monoid,例如它失败了Int.
我有一个工作的替代尝试,它结合了几种形式,但不知何故它只适用于这个玩具示例,而真正的尝试失败了奇怪.无论如何,我不认为这是正确的方法:
data MapPair = MapPair { mpKey :: T.Text, mpValue :: Maybe T.Text }
editForm mmp = renderTable $ MapPair
<$> areq textField "Key" (mpKey <$> mmp)
<*> aopt textField "Value" (mpValue <$> mmp)
pair2mp (v,k) = MapPair { …Run Code Online (Sandbox Code Playgroud) 鉴于一个刚刚搭建的Yesod应用程序,获取作为CGI程序的可执行文件所需的最小变更集是什么?包装程序是可以接受的.如果'cabal build'构建的默认可执行文件是CGI程序,则必须设置哪些环境变量才能充当CGI(默认情况下,它将绑定到端口并尝试在那里提供请求.)
对于FastCGI的类似答案也将受到赞赏.
我想对一些文本进行url编码(例如,用%20替换每个空格等).我找到了"HTTP"Network.HTTP.Base.urlEncode并且可以使用它,但我想知道Yesod生态系统中是否还有其他通常使用的东西.
我正在尝试Data.HashMap通过按外键字段对多个Persistent实体进行分组来构建结构.比如说我有这两个实体(直接来自Yesod书)
Person
name String
age Int Maybe
deriving Show
BlogPost
title String
authorId PersonId
deriving Show
Run Code Online (Sandbox Code Playgroud)
我想要一个:
HashMap PersonId [BlogPost]
Run Code Online (Sandbox Code Playgroud)
这里的挑战是PersonId没有直接实现Hashable(来自Data.Hashable),另外它根据你正在使用的数据库进行抽象(在我的情况下是Postgres).
我想(只是一个疯狂的初学者猜测)我可以通过执行fromPersistValue和read进入Int64 实现Hashable for PersonId ,其中已经有一个Hashable实现,但我想可能有一种不太复杂的方法来实现它.
有什么建议?
在正常Handler工作流中很容易运行数据库操作,因为该runDB功能可用于将SqlPersistM操作转换为操作Handler.
但是没有这种方法可以SqlPersistM直接转换为IO使用默认的应用程序设置.查看Foundation.hs应用程序脚手架中定义的内容,有以下实例
instance YesodPersist App where
type YesodPersistBackend App = SqlBackend
runDB action = do
master <- getYesod
runSqlPool action $ appConnPool master
instance YesodPersistRunner App where
getDBRunner = defaultGetDBRunner appConnPool
Run Code Online (Sandbox Code Playgroud)
它基本上runSqlPool与应用程序的配置一起使用,但我没有看到如何利用它来访问REPL中的配置表单的简单方法.
TL; DR:我正在寻找的只是能够runDB $ selectList [...] [...]在我的Yesod应用程序中从cabal repl中执行某些操作,而无需复制Yesod脚手架开箱即用的设置.