Simple case how to improve your controller in a Rails application
Step 1. Route to the main page
First I want to check #root route of an App
I go to config/routes.rb and see
Rails.application.routes.draw do
  root to: 'root#index'
end
Step 2. Checking the controller
I visit the controller app/controllers/root_controller.rb
class RootController < ActionController::Base
  def index
    @mailto = "hello@company.com"
    @blogs = Blog
             .published
             .limit(10)
  end
end
Step 3. How to Improve
I see a way to improve the controller. I want to move numbers and strings in constants.
Rule: Do not keep Magic numbers in your code. Always move it constants!
class RootController < ActionController::Base
  MAIN_EMAIL = "hello@company.com"
  INDEX_BLOGS_COUNT = 10
  def index
    @mailto = MAIN_EMAIL
    @blogs = Blog
             .published
             .limit(INDEX_BLOGS_COUNT)
  end
end
Step 4. Adding tests
In my app test environment is already set up. I will just improve existed tests a bit.
require 'rails_helper'
RSpec.describe RootController type: :controller do
  describe 'Constants' do
    it "has expected INDEX_BLOGS_COUNT" do
      expect(RootController::INDEX_BLOGS_COUNT).to eq 10
    end
    it "has expected MAIN_EMAIL" do
      expect(RootController::MAIN_EMAIL).to
        eq("hello@company.com")
    end
  end
  describe '#index' do
    let!(:published_blogs) { create_list :blogs, 3, :published }
    before do
      get :index
    end
    it do
      expect(response).to render_template(:index)
    end
    it do
      expect(assigns(:blogs).map(&:id)).to
        match_array(published_blogs.map(&:id))
    end
    it { expect(assigns(:mailto)).to eq RootController::MAIN_EMAIL }
  end
end
Step 5. Running the test case
bundle exec rspec spec/controllers/root_controller_spec.rb
That is it!
Happy Coding!
 

 
    
Top comments (0)