标签: yesod

如何用hamlet打印以逗号分隔的列表?

使用yesod附带的hamlet模板语言,打印逗号分隔列表的最佳方法是什么?

假设这个代码只打印一个接一个的条目,如何在元素之间插入逗号?或者甚至可能在最后一个条目之前添加"和":

The values in the list are
$ forall entry <- list
    #{entry}
and that is it.
Run Code Online (Sandbox Code Playgroud)

一些模板语言(如Template Toolkit)提供了检测第一次或最后一次迭代的指令.

templates haskell yesod hamlet

6
推荐指数
1
解决办法
436
查看次数

为什么Yesod中没有ToJSON/FromJSON的持久类型实例?

这并不是难写的生成类型的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生成什么来获得正确的咒语.

haskell yesod aeson

6
推荐指数
2
解决办法
1658
查看次数

与主机名无关的Yesod应用程序

这是一个非常简单的问题:如何运行可以同时处理多个主机的Yesod应用程序?

默认的Yesod设置可以处理来自任何主机的传入连接,但所有URL都会approot在它们前面进行渲染.joinPath如果存在一种存储当前域的方式以便该函数可用,那么覆盖Yesod实例声明是可能的,但是没有.

这个维基页面上描述的方法有效,但是非常hackish,因为它强制路由采取额外的domain参数(因为我没有一组静态的域匹配).出于实际目的(因为我有很多路由,其中​​一些是与域无关的),最好有一个解决方案使路由不受影响,因为仍然可以从WAI请求信息中获取主机名.处理函数.

我使用需要绝对URL的东西(例如电子邮件,RSS,XML API),因此approot _ = ""不是一种选择.

我不能也不能在编译时知道需要支持的所有主机名.

那么,如何呈现URL以便它们使用传入请求的主机名,而不是approot变量?

haskell vhosts yesod

6
推荐指数
1
解决办法
401
查看次数

Yesod可编辑表

我需要创建一个包含可编辑列的表.每行都是一个单独的记录.我希望能够显示数百条记录,对它们执行编辑,然后将它们提交回服务器进行更新.我不确定表单基础结构是否真的支持它.

有没有办法制作一个可重复的形式,以便我得到一个结果列表?这似乎是我能想象的最接近的解决方案,而无需在javascript中编写自己的解决方案.任何关于此的想法都会受到欢迎.

haskell yesod

6
推荐指数
1
解决办法
384
查看次数

深可能与yesod堆叠

我正在尝试设置一个授权方案,我检查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)

haskell yesod

6
推荐指数
1
解决办法
245
查看次数

使用yesod生成动态表单

如何使用不同数量的输入字段动态生成表单?

我管理的最接近的是:

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)

haskell yesod

6
推荐指数
1
解决办法
932
查看次数

将Yesod应用程序配置为CGI

鉴于一个刚刚搭建的Yesod应用程序,获取作为CGI程序的可执行文件所需的最小变更集是什么?包装程序是可以接受的.如果'cabal build'构建的默认可执行文件是CGI程序,则必须设置哪些环境变量才能充当CGI(默认情况下,它将绑定到端口并尝试在那里提供请求.)

对于FastCGI的类似答案也将受到赞赏.

haskell cgi fastcgi yesod

6
推荐指数
1
解决办法
482
查看次数

在Yesod生态系统中,对某些文本进行urlencode的最佳方法是什么?

我想对一些文本进行url编码(例如,用%20替换每个空格等).我找到了"HTTP"Network.HTTP.Base.urlEncode并且可以使用它,但我想知道Yesod生态系统中是否还有其他通常使用的东西.

haskell urlencode yesod

6
推荐指数
1
解决办法
717
查看次数

通过Persistent的实体密钥进行哈希?

我正在尝试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).

我想(只是一个疯狂的初学者猜测)我可以通过执行fromPersistValueread进入Int64 实现Hashable for PersonId ,其中已经有一个Hashable实现,但我想可能有一种不太复杂的方法来实现它.

有什么建议?

haskell yesod

6
推荐指数
2
解决办法
370
查看次数

如何在REPL中运行Yesod的DB操作?

在正常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脚手架开箱即用的设置.

haskell persistent yesod

6
推荐指数
1
解决办法
227
查看次数

标签 统计

haskell ×10

yesod ×10

aeson ×1

cgi ×1

fastcgi ×1

hamlet ×1

persistent ×1

templates ×1

urlencode ×1

vhosts ×1