[Haskell-beginners] Yesod question - ajax.lhs

Michael Snoyman michael at snoyman.com
Fri May 20 06:59:13 CEST 2011


My point is that it *is* working, exactly as intended. The compiler
warnings are deprecation messages, which mean that at some point in
the future the code may not work anymore. But by keeping it as-is, we
retain some backwards-compatibility with old code.

Michael

On Fri, May 20, 2011 at 6:47 AM, Michael Litchard <michael at schmong.org> wrote:
> Michael,
>            Your examples have a lot to do with why I picked Yesod in
> the first place. I've used a few of them to play around with and get a
> better grasp of your framework. I'm not knowledgeable enough at this
> point to extrapolate what's wrong with your code and then fix it.
> Could you provide a fixed version? I will then use it to play around
> with jQuery and see if I can't get a tabbed navbar going. The ultimate
> goal is to steal as much as I can from the haskellers design.
>
> Thanks :)
>
> Michael
>
> On Thu, May 19, 2011 at 8:38 PM, Michael Snoyman <michael at snoyman.com> wrote:
>> On Fri, May 20, 2011 at 3:38 AM, Michael Litchard <michael at schmong.org> wrote:
>>> I'm using yesod 0.8.1
>>>
>>> I'm playing around with yesod examples 0.8.0.1 and I noticed a few
>>> things that send up some red flags
>>>
>>> first thing, when I try to run ajax.lhs from the top level directory
>>>
>>>
>>>
>>>
>>> src/ajax.lhs:6:3:
>>>    Warning: In the use of `string'
>>>             (imported from Yesod, but defined in Text.Blaze.Internal):
>>>             Deprecated: "Use Blaze.Html.toHtml"
>>
>> This is just using an older version of blaze-html. Replacing "string"
>> with "toHtml" should work just fine.
>>
>>> src/ajax.lhs:37:18:
>>>    Warning: Deprecated syntax:
>>>               quasiquotes no longer need a dollar sign: $parseRoutes
>>>
>>> src/ajax.lhs:52:21:
>>>    Warning: Deprecated syntax:
>>>               quasiquotes no longer need a dollar sign: $hamlet
>>>
>>> src/ajax.lhs:93:17:
>>>    Warning: Deprecated syntax:
>>>               quasiquotes no longer need a dollar sign: $hamlet
>>
>> This is intentional. GHC 7 changed the syntax for QQ. The examples
>> still mostly use the GHC 6.12 syntax for backwards compatibility.
>>
>>>
>>> This is suggesting to me the example code hasn't caught up to the
>>> changes in yesod, which can cause confusion for n00bs like me.
>>>
>>> I'm trying to learn how to use jQuery via yesod, and when I see the
>>> html generated from the current ajax.lhs this is what comes up
>>>
>>> <!DOCTYPE html><html><head><title>Page 1</title><link rel="stylesheet"
>>> href="/static/style%2Ecss?YaQxW21D"><script
>>> src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script><script
>>> src="/static/script%2Ejs?NWBIzSLG"></script></head><body><ul
>>> id="navbar"><li><a href="/page/page%2D1">Page 1</a></li><li><a
>>> href="/page/page%2D2">Page 2</a></li><li><a href="/page/page%2D3">Page
>>> 3</a></li></ul><div id="content"><h1>Page 1</h1><article>My first
>>> page</article></div></body></html>
>>>
>>> I want to draw attention to
>>> <script src="/static/script%2Ejs?NWBIzSLG"> and things like this. This
>>> is the other red flag that the example code hasn't caught up to the
>>> current state of Yesod. Am I interpreting the problem correctly?
>>
>> Yesod provides the query string as an optimization to allow you to set
>> cache headers. There's a good reason the code looks like that. (Though
>> I'm surprised the period is getting URL-encoded, looks like an issue
>> with http-types. And before anyone bugs the author of the package, it
>> looks like an issue with the code *I* wrote.)
>>
>>> Here is what the latest example of ajax.lhs looks like. Could someone
>>> tell me what needs to change to prevent the above problems from
>>> happening?
>>>
>>>> {-# LANGUAGE TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses, OverloadedStrings #-}
>>>> import Yesod
>>>> import Yesod.Helpers.Static
>>>> import Data.Monoid (mempty)
>>>
>>> Like the blog example, we'll define some data first.
>>>
>>>> data Page = Page
>>>>   { pageName :: String
>>>>   , pageSlug :: String
>>>>   , pageContent :: String
>>>>   }
>>>
>>>> loadPages :: IO [Page]
>>>> loadPages = return
>>>>   [ Page "Page 1" "page-1" "My first page"
>>>>   , Page "Page 2" "page-2" "My second page"
>>>>   , Page "Page 3" "page-3" "My third page"
>>>>   ]
>>>
>>>> data Ajax = Ajax
>>>>   { ajaxPages :: [Page]
>>>>   , ajaxStatic :: Static
>>>>   }
>>>> type Handler = GHandler Ajax Ajax
>>>
>>>
>>>> staticFiles "static/yesod/ajax"
>>>
>>>> mkYesod "Ajax" [$parseRoutes|
>>>> /                  HomeR   GET
>>>> /page/#String      PageR   GET
>>>> /static            StaticR Static ajaxStatic
>>>> |]
>>>
>>>
>>>> instance Yesod Ajax where
>>>>   approot _ = ""
>>>>   defaultLayout widget = do
>>>>   Ajax pages _ <- getYesod
>>>>   content <- widgetToPageContent widget
>>>>   hamletToRepHtml [$hamlet|
>>>> \<!DOCTYPE html>
>>>>
>>>> <html>
>>>>   <head>
>>>>     <title>#{pageTitle content}
>>>>     <link rel="stylesheet" href="@{StaticR style_css}">
>>>>     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js">
>>>>     <script src="@{StaticR script_js}">
>>>>     \^{pageHead content}
>>>>   <body>
>>>>     <ul id="navbar">
>>>>       $forall page <- pages
>>>>         <li>
>>>>           <a href="@{PageR (pageSlug page)}">#{pageName page}
>>>>     <div id="content">
>>>>       \^{pageBody content}
>>>> |]
>>>
>>>
>>>> getHomeR :: Handler ()
>>>> getHomeR = do
>>>>   Ajax pages _ <- getYesod
>>>>   let first = head pages
>>>>   redirect RedirectTemporary $ PageR $ pageSlug first
>>>
>>>> getPageR :: String -> Handler RepHtmlJson
>>>> getPageR slug = do
>>>>   Ajax pages _ <- getYesod
>>>>   case filter (\e -> pageSlug e == slug) pages of
>>>>       [] -> notFound
>>>>       page:_ -> defaultLayoutJson (do
>>>>           setTitle $ string $ pageName page
>>>>           addHamlet $ html page
>>>>           ) (json page)
>>>>  where
>>>>   html page = [$hamlet|
>>>> <h1>#{pageName page}
>>>> <article>#{pageContent page}
>>>> |]
>>>>   json page = jsonMap
>>>>       [ ("name", jsonScalar $ pageName page)
>>>>       , ("content", jsonScalar $ pageContent page)
>>>>       ]
>>>
>>>> main :: IO ()
>>>> main = do
>>>>   pages <- loadPages
>>>>   let s = static "static/yesod/ajax"
>>>>   warpDebug 3000 $ Ajax pages s
>>>
>>> _______________________________________________
>>> Beginners mailing list
>>> Beginners at haskell.org
>>> http://www.haskell.org/mailman/listinfo/beginners
>>>
>>
>



More information about the Beginners mailing list