service_crud gem: A simple mixin for adding crud actions for a RESTful, ActiveResource style service (xml and json).
This gem works with Rails 3.
$ cd /path/to/your/rails3/app $ echo "gem service_crud" >> Gemfile $ bundle install
Let's suppose we have a "Book" model, and we want to create XML and JSON RESTful services for it. Simple:
First, go to your routes.rb file and add the following route:
Next, create the following controller in RAILS_ROOT/app/books_controller.rb:
class BooksController include ServiceCrud end
That's it. You can now GET, POST, PUT, and DELETE books through the standard RESTful urls.
Sometimes you need to do a little extra work on your data before/after you create/update/destroy. And sometimes that can't be pushed down to the ORM layer.
For example, suppose we want to set the
:updated_by property on our model to the
current_user. We could simply:
class BooksController include ServiceCrud before_update :set_updated_by private def set_updated_by(model) model.update_by = current_user end end
ServiceCrud supports the following callbacks:
service_crud library will look at the controller name and try to guess the model (e.g., "BooksController" -> "Book").
If your controller name doesn't match your model, call the
class MyBooksController include ServiceCrud model Book end
PUT/POST parameter guessing
Similarly, on POST or PUT,
service_crud assumes that the top-level node of the XML or JSON is the lowercased, underscored, singularized symbol of your model name.
If that's not the case for your service, call the
model_attribute_root class method:
class BooksController include ServiceCrud model_attribute_root :my_book end
service_crud library assumes an ActiveRecord ORM by default. It also, out of the box, supports the
couchrest_model ORM for couchdb.
class BooksController include ServiceCrud orm_methods! ServiceCrud::CouchRest::Model end
The default ORM methods are:
module ServiceCrud module DefaultOrm def all; :all; end def new; :new; end def find; :find; end def destroy; :destroy; end def update_attributes; :update_attributes; end def save; :save; end end end
If you're using an ORM other than ActiveRecord or CouchRest::Model, and some or all of your ORM's method names differ from ActiveRecord's,
then simply create a module that redefines one or more DefaultOrm methods. For example, suppose we create our own ORM,
MoonOrm, and our method for finding
lookup instead of
find. Then we'd simply:
module MoonOrmMethods def find; :lookup; end end
Then, in our controller:
class BooksController include ServiceCrud orm_methods! MoonOrmMethods end