Often after I’m finished building the bulk of a web app, I find there are some secondary pages that need to be built. These pages are largely
informational, such as an about page, a contact page, an FAQ, etc. They’re relatively static in terms of the content, but it’s always nice
if we can supply our client (or ourselves) with a nice CMS-style interface to make updating them easy, and within the context of our
existing application layouts. Keep it simple, keep it DRY.
The obvious thing is to cook up some sort of PagesController from scratch. This is nice because it’ll make use of your existing
facilities, your authentication/authorization system, layouts, etc. It is custom, after all, and a custom fit is almost always the best fit.
But it’s a fair bit of work for something that’s probably not ‘core’ to the application, and takes cycles away from other places they could be
On the other hand, you can integrate with a 3rd-party CMS or blogging package like Typo, Radiant CMS, or Mephisto. They’re all great packages
and do what they do really well. The downside is you’ve got to write a fair amount of glue to hook everything together and make it look (and
Another option is to use Matt McCray’s Comatose plugin, a micro CMS. It’s got
all the basic functionality you want for this sort of stuff out of the box and it couldn’t be much easier to use. The real bonus is integration
is almost completely seemless, which makes it (imho) the best of both worlds for this sort of project.
Installing the plugin gets you a ComatoseController and a ComatoseAdminController. You add an entry (or multiple entries, if you
like) in your routes file to tell your application when to invoke the ComatoseController. You might prefer a scheme where all URLs starting
with /pages are passed to Comatose, for example. Then you log into the admin controller (which also needs an entry in routes) to create the
pages. All the basic management tools we need are here; pages are organized hierarchically and can be edited with great ease, using a
variety of markup filters. Each page gets a number of attributes, including a title, keywords, author, etc.
Basically it’s everything we need for the bare-minimum no-frills CMS experience and nothing we don’t. Which is just the way I like it. Check
it out for your next project.
Anyone having issues with Comatose and authentication should check out
this bug report. If you’re specifying an alternate session key, you should put it in
environment.rb instead of ApplicationController.
ActionController::Base.session_options[:session_key] = "_your_custom_session_id"
Comatose controllers inherit directly from ActionController::Base instead of from your application controller. So if you specify the
session key in application.rb, the Comatose-driven sections of your app will be blissfully unaware of it. This means a method like logged_in?
(which checks the session for your login status) will always report back as false.