Static pages for the enterprise

Static pages for the enterprise

HasManyThroughJoshSusser writes about how to handle simple static pages.

This is a fairly simple problem that many sites face. You want to keep use of your layout (and any conditionals in it - like a login/logout area, for example), but it feels like overkill to build a bunch of empty actions just to render static content. Not to mention that it’s a disgusting violation of RESTful action naming (which, personally speaking, would keep me up at night).

In Josh’s example, he already has a home_controller with an index action for his homepage - and he takes advantage of that existing controller by adding a #show action to it, and adding a route which will send his static content page requests to that action:


map.home ':page', :controller => 'home', :action => 'show', :page => /about|contact/

This works well, but I don’t really like the overloading of the home_controller #show action there. You’re not showing a home … unless it’s a real estate app and all your static pages are actually For Sale listings … !!!

Here’s an enterprisey static page solution I recently used.

In your routes…


  map.site 'site/:name', :controller => 'page', :action => 'show'

And in PageController…


class PageController < ApplicationController

verify :params => :name, :only => :show, :redirectto => :rooturl beforefilter :ensurevalid, :only => :show

def show render :template => "pages/#{current_page}" end

protected

def currentpage params[:name].tos.downcase end

def ensurevalid unless %w(about copyright guidelines help privacy terms).include? currentpage render :nothing => true, :status => 404 and return false end end

end

In this approach, I do a few things to help myself sleep at night:

  • I’m staying RESTful with action naming - that’s maybe one hour each night
  • I’m keeping the logic about what’s a valid page or not in the controller (which is the next best spot to the filesystem) - although I like Josh’s suggestion to use a PAGES constant in the controller as well.
  • I’m avoiding the implicit action behavior that rails gives you when you have files on disk which match requested paths. I’ve never liked this, so I don’t want to reward bad behavior by taking advantage of it.

We’ve also done the create an empty SiteController and throw static content in app/views/site/* approach - and we’ve also tried using Comatose - with mixed results.

What does everyone else do?

Matt Jankowski Developer