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)