That simplifies things a bit. Here it is for completeness:

--- myapp.rb ---
require 'rubygems'
require 'sinatra'
require 'json'
require 'widget'

get '/widgets.json' do
  Widget.all.to_json
end

get '/widgets/:id.json' do
  Widget.find(Integer(params[:id])).to_json
end

post '/widgets.json' do
  item = JSON.parse(request.body.read)
  Widget.create(item).to_s
end

--- widget.rb ---
# Rubbish model, not thread-safe!
class Widget
  attr_accessor :id, :name, :price
  def initialize(params)
    @id    = params["id"]
    @name  = params["name"]
    @price = params["price"]
  end
  def to_json(*a)
    instance_variables.inject({}) { |h,v|
      h[v.to_s[1..-1]] = instance_variable_get(v)
      h
    }.to_json(*a)
  end

  @all = []
  @seq = 0
  def self.all
    @all
  end
  def self.add(item)
    item.id = (@seq += 1)
    all << item
    return @seq
  end
  def self.create(params)
    add(new(params))
  end
  def self.find(id)
    all.find { |item| item.id == id }
  end
end
Widget.create("name" => "flurble", "price" => 12.3)
Widget.create("name" => "boing", "price" => 4.56)

If you require 'json/add/rails' then you don't need to define your own 
to_json method, but it also allows people to create arbitrary Ruby 
objects on your machine (which makes me uncomfortable)
-- 
Posted via http://www.ruby-forum.com/.