Thursday, June 14, 2007

Code syntax highlighting on blogspot

For my last post I wanted to get syntax highlighting for my code examples. That was not as easy as I had hoped!
(I think I spent more time trying to fix that than I spent on examining the activeresource-API...)

Anyway I tried a lot to get SyntaxHighlighter to work. But I did not succeed.
What I did end up doing instead was to follow the advice from QuirkeyBlog and use the TextMate Bundle's "Create css from theme" and "Create HTML" from theme. I'm pretty pleased with the result that is visible on screen, but it demanded a lot of copy-pasting of html-code. I have to automate that process for next "code-example-post". If anybody out there have a better idea of how to get syntax highlighting to work on blogger, please tell me.

Wednesday, June 06, 2007

What is a RESTful application?

In the Rails community (and elsewhere) there is a lot of talk about "RESTful applications". But there is a lot of questions of what is really meant by REST. IMHO the most characteristic and interesting parts of REST is:

  • Everything is a resource, uniquely addressable using a URI.
  • There are a few well-defined operations to view and change state of a resource
For Rails, the REST-buzz started with David's keynote at RailsConf last year and the "RESTful" controllers/routing was part of Rails 1.2, where it is very easy to create a webapp with "RESTful" characteristics (the new routing etc.). The client side of the RESTful interface, Active Resource, was not part of rails 1.2 but now can be easily used anyway. I come back to how soon...

Maybe the easiest way to create a RESTful application in rails is using the "scaffold_resource" generator (since rails 1.2).

Example "service":
$ ./script/generate scaffold_resource result match_date:date home_team:string\
away_team:string home_score:integer away_score:integer
$ rake db:migrate
$ ./script/server

Apart from giving a web application that can be used right away this also gives a REST-service that can be used with for example curl. When at least one item has been added with the scaffold web app, it can look like the following.
$ curl http://localhost:3000/results/1.xml

<?xml version="1.0" encoding="UTF-8"?>
<result>
<away-score type="integer">0</away-score>
<away-team>Denmark</away-team>
<home-score type="integer">3</home-score>
<home-team>Sweden</home-team>
<id type="integer">1</id>
<match-date type="date">2007-06-02</match-date>
</result>


Ok, that's fine. There is a lot of stuff that we get for free when using scaffold_resource. But how can we have a little more sophisticated client than curl?
Here comes the fun part. As I said above, ActiveResource was not part of Rails 1.2, but we don't even need to run edge-rails to run it now. It has been released as a gem and can be easily downloaded and installed, see Ryan's post for more info.
  • sudo gem install activeresource --source http://gems.rubyonrails.org
If the activeresource gem is installed we only need a couple lines of ruby code to access and make changes to resources. We don't even need rails, a small ruby-client will do.

require 'rubygems' 
require 'active_resource'

class Result < ActiveResource::Base
self.site = "http://localhost:3000/"
end

result = Result.find(1)
p result.home_team



This will access my REST-service and print out the home team of the resource "results/1" => Sweden.

The really cool use of activeresource comes when I want to create a new record. When I add to my following code example:

Result.create :home_team=>"Sweden", :away_team=>"Iceland", :home_score=>5, :away_score=>0, :match_date=>Time.now


It creates a new entry in my railsapp, that instantly can be accessed by activeresource or in a browser with
http://localhost:3000/results/2

I think it is pretty amazing that you in just a few lines of ruby code can create both a REST-service and client. The next step for me will be to test how activeresource and REST might work for a larger application. How about error handling? Using other clients than Ruby towards my REST-service (like a Java-client)? Can I throw out my SOAP-solutions now? (say yes!)...