[racket-dev] Racket on Rockets
I was recently telling some people that I thought 'Ruby on Rails' was
mostly an ORM plus a set of default dispatching rules with convenient
ways of extending the defaults.
I don't have a lot of expertise on the ORM side, but I think Snooze
would probably be awesome and my MongoDB-backed structs may be helpful
too.
On the side of default dispatching rules, I've made a little demo:
https://github.com/jeapostrophe/exp/tree/master/ror
[For the demo, the ORM is just hash tables of structs.]
This program:
#lang racket/base
(require "ror.rkt")
(blast-off!
[posts (title body)])
is an incredibly generic "blog" where you can see all the posts, add
new ones, and edit old ones. It sets up a slew of un-hygienic names
and allows you to override them to replace default behavior.
This program uses that overriding feature to replace the top-level index:
#lang racket/base
(require web-server/servlet
"ror.rkt")
(define (post-render id)
(define obj (hash-ref *posts* id))
`(div (h2 ,(posts-title obj))
,(posts-body obj)))
(define (index req)
(response/xexpr
`(html
(head (title "My Racket on Rockets blog"))
(body
(h1 "My Racket on Rockets blog")
,@(for/list ([last-post-n (in-range 5)])
(define post-id (- (hash-count *posts*) (add1 last-post-n)))
(if (negative? post-id)
'(div)
(post-render post-id)))
(p (a ([href ,(to-url posts-new)]) "New Post") " "
(a ([href ,(to-url posts-index)]) "All Posts"))))))
(blast-off!
[posts (title body)])
You could also define posts-new or posts-index to control the
corresponding default functions.
In case what I had in mind wasn't clear... I hope this is.
Jay
--
Jay McCarthy <jay at cs.byu.edu>
Assistant Professor / Brigham Young University
http://faculty.cs.byu.edu/~jay
"The glory of God is Intelligence" - D&C 93