The pre_render Gem
Adds support for a pre_render() method to Rails controllers.
Installation
Add the following line to your Rails application's Gemfile:
gem "pre_render"Usage
Let's say you have a Person model with the accompanying PeopleController.  Then the controller might look something
like this:
class PeopleController < ApplicationController
  before_action :set_person, only: [:show, :edit, :update, :destroy]
  # GET /people
  # GET /people.json
  def index
    @people = Person.all
  end
  # GET /people/1
  # GET /people/1.json
  def show
  end
  # ...
  protected
  def pre_render(view, *args)
    logger.info "Preparing to render the \"#{view}\" view of #{self.class}"
    case view
    when :index
      # ...
    when :edit
      # ...
    # ...
    end
  end
  private
  # Use callbacks to share common setup or constraints between actions.
  def set_person
    @person = Person.find(params[:id])
  end
  # Never trust parameters from the scary internet, only allow the white list through.
  def person_params
    params.require(:person).permit(:first_name, :last_name, :age)
  end
endThe pre_render() method will be called right before Rails' render() method.  This will give your controller a last chance
to fully initialize any instance variables a view might need to render itself.  If you are using some sort of view model or
presenter construct, this is a good place to initialize or finish initializing it.
The usefulness of this construct becomes apparent when validation comes into play.  Suppose your Person model looks like this:
class Person < ActiveRecord::Base
  validates :first_name, presence: true
  validates :last_name, presence: true
  validates :age, presence: true
endWhen someone goes to create a new Person record, but forgets to enter a required field and hits the Create button,
PeopleController#create() will refuse to create the record due to failed validation.  At that point, the controller will want
to render the new view once more, even though the action_name is create.  Except this time when pre_render()
is called, the view argument will rightly be :new, allowing you to do whatever is needed to ensure the view
renders successfully.
Credits
The idea for this gem came from my time spent working as a classic ASP.NET developer.  The ASP.NET Page Event model supports the
notion of a PreRender() method being called right before the Render() method to allow an application's code-behind
class to finish initialization of its properties and fields.
I found this to be useful then, as I do now in the Rails world.