Renee, the friendly rack-based framework
reneerb.com
reneerb.com
Americans who can't even point Russia on a map and know their history from the History channel and New York Times bestseller books (if that)?
For hundreds of millions of people all around the world it was an inspiration, even if faulty, and hardly comparable to nazism.
So, there.
It would probably be better not to hash this out on HN, though, so I've downmodded the root comment on this thread.
before '/blog/:id' do
@blog = Blog.get(params[:id])
end
get '/blog/:id' do
@blog
end
put '/blog/:id' do
@blog.update_attributes(params)
end
and turn it into path 'blog' do
var do |id|
@blog = Blog.get(id)
get { halt @blog }
put { @blog.update(request.params); halt :ok}
end
end
I feel this is DRY'er than the Sinatra representation. It also has nice integration with Rack itself. The implementation is very simple, easy to get into. class Blog < R '/blog/(\d+)'
def service(id) @blog = Blog.get(id); super end
def get(id) render :blog end
def put(id) @blog.update_attributes(@input) end
end Cuba.define do
on "blog/:id" do |id|
blog = Blog.get(id)
on(get) { res.write blog }
on(put) { blog.update(req.params); res.write :ok }
end
endSomething like this:
handle '/blog'
That's it. This makes some assumptions:* That /blog maps to a class Blog which it can load and save. * That you either use "fat models" (with callbacks that munge data and perform actions when data changes) or external observers (like ActiveRecord's observers). * That the model supports all four CRUD actions.
When you want additional verbs:
handle 'GET /blog/search' do
MySearchEngine.search(params[:q])
end
Or object-specific ones: handle 'GET /blog/:id/search' do |blog|
MySearchEngine.search(params[:q], :blog_id => blog.id)
end
In fact, aside from extra verbs, you could get away with no code at all, since you could introspect the database layer to discover which classes are mappable.My app is a JavaScript-based single-page HTML5 web application using Backbone, so there is almost no server-side frontend code, meaning my app is basically a server-side database anyway.
Although in real applications, most of your methods are complex enough that you'd want them to be multiline blocks, at which point it would start to get really ugly IMO.
Anyway it sounds like I'm being more critical than I actually am I think.
But my un-DRY annoyance with Sinatra isn't writing multiple blocks with route declarations for CRUD methods, so much as not being able to refer to those routes in your views abstractly. ie., if you decide you want to change from /comments/:id to /awesome-comments/:id, it's a headache.
I assume there are plugins to fix that annoyance, but I'd have like Sinatra to generally have routing more abstracted from specific URL paths.
Not because of the name ;)
Anyone know what inspired the name, theme etc?
Renee is my gf's name, and she's very patient with me when I wanna work on open source, so, it's a nod to her.
The inspiration for it came from Railsconf 2009 when one of the Sinatra guys said how get "/:id" do |id| was a smell because of the id repeat. I had been working on a new routing DSL for Goliath, when I got an itch to start making simple, useful rack apps.
path 'blog' do |id|
@blog = Blog.get(id)
get { halt @blog }
put { @blog.update(request.params); halt :ok}
end
Why do you need the var call within the block? Also, you seem to break the ruby convention of using do end for blocks larger than one line, in many of your examples.(Again, I spent three seconds on your site, so you may have a solid reason for this and have explained it already as well.)
var Integer do |id|
this will only continue if it matches against an Integer (and it will also cast it for you). The argument list might get hella complicated if you allow munging like that.I am considering allowing chaining though, so,
path('blog').var do |id|
What would you think of that?I love Sinatra, and I'm big on DRY, so I'll definitely give Renee a shot.
BTW, noticed the 'GITHUB FORK YOU', nice haha.
I'd honestly pass on an open source project not following the generally agreed upon ruby standard.
That's my reasoning too. At first, I thought it was more readable (read: familiar) to use curly braces, but now I stick with do...end for blocks >1 line. Sometimes it's helpful for breaking up complex nested map() blocks as well.