2013-02-08 4 views
2

에 응답했습니다. 하스켈을 매우 신중하게 생각합니다. 누군가 다음과 같은 문제를 해결할 수있는 올바른 방향으로 나를 밀어 줄 수 있었습니까?yesod가 일반 텍스트

나는 Yesod의 스캐 폴딩 응용 프로그램으로 시작했습니다. 데이터베이스 콘텐츠에서 생성 된 HTML 검색은 정상적으로 작동하지만 데이터베이스 테이블을 반복하는 일반 텍스트 응답을 만드는 우아한 방법이 있습니까?

getTestR = return . RepPlain . toContent ... 

같은 처리기를 사용하여 간단한 일반 텍스트도 작동하지만 봉사하고 싶습니다 :

설정/모델 : SQL 쿼리와 같이 일반 텍스트로

File 
    path Text 
Conf 
    key Text 
    val Text 
    file FileId 

:

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

hamlet은 HTML을 생성하기 때문에 응답을 생성해야합니다 (데이터베이스 내용을 반복). 하스켈에서?

데이터베이스 엔터티와 텍스트 (또는 행이 Int 유형 인 경우 Int) 사이를 변환하려면 어떻게해야합니까? 데이터베이스 열 ID를 어떻게 변환합니까?

+0

확인 theese [SQL 쿼리 예제]의 경우와 같은 텍스트, 문자열, INT32 또는 INT64 표현을 인정 -selectonemany-in-yesod) –

답변

2

일반 텍스트 템플릿이 있습니다. ''#는 {EXPR은} ''http://stackoverflow.com/questions/9047636/baffled-by (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} |]