One of my Rails apps recently took responsibility for serving the home page and marketing pages from an installation of Wordpress, mainly to allow for a site-wide nav bar which shows login status. Doing this in Rails is not rocket science, but after experimenting with a few different approaches this is the approach I think works best, along with an improvement to the status quo.
The idea is to put all the static pages in a
PagesController which has a single action and corresponding view for each static page. So your homepage would have an
index action and a corresponding
index.html.erb view file. And your About Us page might be an
about action with an
about.html.erb view. And so on. Here's what it all looks like.
App::Application.routes.draw do root to: "pages#index" get :contact, to: "pages#contact" get :about, to: "pages#contact" end
class PagesController < ApplicationController def index end def contact end def about end end
And then you just have a single view to match each action in
This is all fine and straightforward, but those route declarations really bothered me. They strike me as very repetitious, especially as you add more and more static pages, so I went digging through the Rails documentation and came across the controller route macro. It essentially scopes a bunch of routes to a specific controller. In other words, exactly what I was looking for.
Now your routes look like this:
App::Application.routes.draw do controller :pages do root to: :index get :contact get :about end end
This solution is two lines longer, yet so much more concise. It nicely groups together a set of routes that are related to each other. I think the Rails route scoping documentation is worth a read if you find yourself repetitively adding the same
controller value to a bunch of different routes.