Skip to content
Pull request Compare This branch is 5 commits ahead, 247 commits behind master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.

Best Practices

A guide for programming well.


Object-Oriented Design

  • Avoid global variables.
  • Avoid long parameter lists.
  • Limit collaborators of an object (entities an object depends on).
  • Limit an object's dependencies (entities that depend on an object).
  • Prefer composition over inheritance.
  • Prefer small methods. One line is best.
  • Prefer small objects with a single, well-defined responsibility.
  • Tell, don't ask.


  • Avoid optional parameters. Does the method do too much?
  • Avoid monkey-patching.
  • Prefer classes to modules when designing functionality that is shared by multiple models.
  • Prefer private when indicating scope. Use protected only with comparison methods like def ==(other), def <(other), and def >(other).

Ruby Gems

  • Declare dependencies in the <PROJECT_NAME>.gemspec file.
  • Reference the gemspec in the Gemfile.
  • Use Appraisal to test the gem against multiple versions of gem dependencies (such as Rails in a Rails engine).
  • Use Bundler to manage the gem's dependencies.
  • Use Travis CI for Continuous Integration, indicators showing whether GitHub pull requests can be merged, and to test against multiple Ruby versions.


  • Avoid bypassing validations with methods like save(validate: false), update_attribute, and toggle.
  • Don't change a migration after it has been merged into master if the desired change can be solved with another migration.
  • Use add_index :table, :column, unique: true to enforce uniqueness constraints and avoid race conditions.
  • Validate the associated belongs_to object (user), not the database column (user_id).


  • Specify the Ruby version to be used on the project in the Gemfile.
  • Use a pessimistic version in the Gemfile for gems that follow semantic versioning, such as rspec, factory_girl, and capybara.
  • Use a versionless Gemfile declarations for gems that are safe to update often, such as pg, thin, and debugger.
  • Use an exact version in the Gemfile for fragile gems, such as Rails.
  • Use --binstubs=bin/stubs to avoid typing bundle exec.


Background Jobs


  • Notify Airbrake about errors.
  • Store IDs, not ActiveRecord objects for cleaner serialization, then re-find the ActiveRecord object in the perform method.


  • Use SendGrid or Amazon SES to deliver email in staging and production environments.
  • Use a tool like mail_view to look at each created or updated mailer view before merging.


  • Disable real HTTP requests to external services with WebMock.disable_net_connect!.
  • Test background jobs with a Delayed::Job matcher.
  • Use a Fake to stub requests to external services.
  • Use integration tests to execute the entire app.
  • Use non-SUT methods in expectations when possible.


  • Don't support clients without Javascript.
  • Don't support IE6.


  • Prefer categories on Foundation classes to helper methods.
  • Prefer string constants to literals when providing keys or key paths to methods.
Something went wrong with that request. Please try again.