2

私はHaskellに非常に慣れていないので、誰かが親切に次の問題を解決する正しい方向に私を押してくれませんか...?

私は Yesod の足場アプリケーションから始めました。データベース コンテンツから生成された HTML の提供は問題なく機能しますが、データベース テーブルを繰り返し処理するプレーン テキスト応答を作成する洗練された方法はありますか? 次のようなハンドラを使用した単純なプレーン テキスト

getTestR = return . RepPlain . toContent ...

も機能しますが、私はサービスを提供したいと思います:

構成/モデル:

File
    path Text
Conf
    key Text
    val Text
    file FileId

SQL クエリのようにプレーンテキストとして:

select path, key, val from file, conf order by path, key;

hamlet は HTML を生成するためのものなので、Haskell で完全に応答 (データベースの内容を反復処理) を生成する必要があると思いますか?

データベースの Entity と Text (または、Row が Int 型の場合は Int) の間で変換するにはどうすればよいですか? また、データベースの列 Id との間で変換するにはどうすればよいですか?

4

1 に答える 1

2

プレーンテキストテンプレート付き!! ''#{expr}'' は、Text、String、Int32 または Int64 式をText.Shakespeare.Text.ToTextのインスタンスとして許可します

{-# LANGUAGE OverloadedStrings, ConstraintKinds #-} 
module Handler.Plain where

import Import
import qualified Data.List as List
import Database.Persist.Sqlite
import qualified Data.Text as Text
import Control.Monad.Logger (MonadLogger)
import Control.Monad.Trans.Resource (MonadResourceBase)
import Text.Shakespeare.Text                       -- for the plain text template

stmt :: Text
stmt = "SELECT ??, ??  FROM File, Conf ON Conf.file = File.id ORDER BY File.path, Conf.key"

getQryResult :: (PersistQuery SqlPersist m, MonadLogger m, MonadResourceBase m) => () -> SqlPersist m [(Text, Text, Text)]
getQryResult () = do
    result  <- rawSql stmt []

    return $ List.map getMyData (result :: [(Entity File, Entity Conf)])

  where
    getMyData (Entity _ file, Entity _ conf) = (filePath file, confKey conf, confVal conf)

getPlainR :: Handler RepPlain
getPlainR = do
    result <- runDB $ getQryResult ()
    return $ RepPlain $ toContent $ Text.unlines $ List.map formatMyData result
  where
    -- formatMyData (a, b, c) = Text.intercalate ", " [a,b,c]

    -- with a plain text template:
    formatMyData (a, b, c) = [st|
         #{a}, #{b}, #{c} |]  
于 2013-02-08T18:32:52.557 に答える