# High Voltage [![Build Status](https://travis-ci.org/thoughtbot/high_voltage.png)](http://travis-ci.org/thoughtbot/high_voltage) Rails engine for static pages. ... but be careful. [Danger!](http://www.youtube.com/watch?v=HD5tnb2RBYg) ## Static pages? Yeah, like "About us", "Directions", marketing pages, etc. ## Installation $ gem install high_voltage Include in your Gemfile: ```ruby gem 'high_voltage', '~> 2.2.1' ``` For Rails versions prior to 3.0, use the 0.9.2 tag of high_voltage: https://github.com/thoughtbot/high_voltage/tree/v0.9.2 ## Usage Write your static pages and put them in the RAILS_ROOT/app/views/pages directory. $ mkdir app/views/pages $ touch app/views/pages/about.html.erb After putting something interesting there, you can link to it from anywhere in your app with: ```ruby link_to 'About', page_path('about') ``` You can nest pages in a directory structure, if that makes sense from a URL perspective for you: ```ruby link_to 'Q4 Reports', page_path('about/corporate/policies/HR/en_US/biz/sales/Quarter-Four') ``` Bam. ## Configuration #### Routing overview By default, the static page routes will be like /pages/:id (where :id is the view filename). If you want to route to a static page in another location (for example, a homepage), do this: ```ruby get 'pages/home' => 'high_voltage/pages#show', id: 'home' ``` In that case, you'd need an `app/views/pages/home.html.erb` file. Generally speaking, you need to route to the 'show' action with an `:id` param of the view filename. High Voltage will generate a named route method of `page_path`. If you want to generate your own named route (with the :as routing option), make sure not to use `:page` as it will conflict with the High Voltage named route. #### Specifying a root path You can configure the root route to a High Voltage page like this: ```ruby # config/initializers/high_voltage.rb HighVoltage.configure do |config| config.home_page = 'home' end ``` Which will render the page from `app/views/pages/home.html.erb` when the '/' route of the site is accessed. Note: High Voltage also creates a search engine friendly 301 redirect. Any attempt to access the path '/home' will be redirected to '/'. #### Top-level routes You can remove the directory `pages` from the URL path and serve up routes from the root of the domain path: http://www.example.com/about http://www.example.com/company Would look for corresponding files: app/views/pages/about.html.erb app/views/pages/company.html.erb This is accomplished by setting the `route_drawer` to `HighVoltage::RouteDrawers::Root` ```ruby # config/initializers/high_voltage.rb HighVoltage.configure do |config| config.route_drawer = HighVoltage::RouteDrawers::Root end ``` #### Disabling routes The default routes can be completely removed by setting the `routes` to `false`: ```ruby # config/initializers/high_voltage.rb HighVoltage.configure do |config| config.routes = false end ``` #### Specifying Rails engine for routes If you are using multiple Rails engines within your application, you can specify which engine to define the default HighVoltage routes on. ```ruby # config/initializers/high_voltage.rb HighVoltage.configure do |config| config.parent_engine = MyEngine end ``` #### Page titles and meta-data We suggest using `content_for` and `yield` for setting custom page titles and meta-data on High Voltage pages. ```ruby # app/views/pages/about.html.erb <%= content_for :page_title, 'About Us - Custom page title' %> ``` Then print the contents of `:title` into the layout: ```ruby # app/views/layouts/application.html.erb <%= yield(:page_title) %> ``` #### Content path High Voltage uses a default path and folder of 'pages', i.e. 'url.com/pages/contact', 'app/views/pages'. You can change this in an initializer: ```ruby # config/initializers/high_voltage.rb HighVoltage.configure do |config| config.content_path = 'site/' end ``` #### Caching Caching has been deprecated and will be removed in the next release. Page caching and action caching can be done via Rails. Visit the [Caching with Rails: An overview](http://guides.rubyonrails.org/caching_with_rails.html) guide for more details. You can utilize the methods described there by overriding the HighVoltage controller as described [below](#override). ## Override Most common reasons to override? * You need authentication around the pages to make sure a user is signed in. * You need to render different layouts for different pages. * You need to render a partial from the `app/views/pages` directory. Create a `PagesController` of your own: $ rails generate controller pages Disable the default routes: ```ruby # config/initializers/high_voltage.rb HighVoltage.configure do |config| config.routes = false end ``` Define a route for the new `PagesController`: ```ruby # config/routes.rb get "/pages/*id" => 'pages#show', as: :page, format: false # if routing the root path, update for your controller root to: 'pages#show', id: 'home' ``` Then modify new `PagesController` to include the High Voltage static page concern: ```ruby # app/controllers/pages_controller.rb class PagesController < ApplicationController include HighVoltage::StaticPage before_filter :authenticate layout :layout_for_page private def layout_for_page case params[:id] when 'home' 'home' else 'application' end end end ``` To set up a different layout for all High Voltage static pages, use an initializer: ```ruby # config/initializers/high_voltage.rb HighVoltage.configure do |config| config.layout = 'your_layout' end ``` ## Custom finding You can further control the algorithm used to find pages by overriding the `page_finder_factory` method: ```ruby # app/controllers/pages_controller.rb class PagesController < ApplicationController include HighVoltage::StaticPage private def page_finder_factory Rot13PageFinder end end ``` The easiest thing is to subclass `HighVoltage::PageFinder`, which provides you with `page_id`: ```ruby class Rot13PageFinder < HighVoltage::PageFinder def find paths = super.split('/') directory = paths[0..-2] filename = paths[-1].tr('a-z','n-za-m') File.join(*directory, filename) end end ``` Use this to create a custom file mapping, clean filenames for your file system, A/B test, and so on. ## Testing You can test your static pages using [RSpec](https://github.com/rspec/rspec-rails) and [shoulda-matchers](https://github.com/thoughtbot/shoulda-matchers): ```ruby # spec/controllers/pages_controller_spec.rb describe PagesController, '#show' do %w(earn_money screencast about contact).each do |page| context 'on GET to /pages/#{page}' do before do get :show, id: page end it { should respond_with(:success) } it { should render_template(page) } end end end ``` If you're not using a custom PagesController be sure to test `HighVoltage::PagesController` instead. Enjoy! ## Contributing Please see [CONTRIBUTING.md](https://github.com/thoughtbot/high_voltage/blob/master/CONTRIBUTING.md) for details. ## Credits ![thoughtbot](http://thoughtbot.com/images/tm/logo.png) High Voltage is maintained and funded by [thoughtbot, inc](http://thoughtbot.com/community) Thank you to all [the contributors](https://github.com/thoughtbot/high_voltage/contributors)! The names and logos for thoughtbot are trademarks of thoughtbot, inc. ## License High Voltage is Copyright © 2009-2014 thoughtbot. It is free software, and may be redistributed under the terms specified in the MIT-LICENSE file.