10 things I add to every Rails app

phawk

Pete Hawkins

Posted on October 2, 2021

10 things I add to every Rails app

I end up creating a lot of Rails apps, and each time I get started I often find myself wanting to add similar features or gems that I’m using in other projects.

Here’s a short list of 10 of the most common things I add to every Rails app.

1. Tailwind CSS

I’ve been using Tailwind now for almost 2 years, I am super productive with it and urge you to give it a try if you haven’t yet.

As Adam the founder says...

If you can suppress the urge to retch long enough to give it a chance, I really think you'll wonder how you ever worked with CSS any other way.

Check out my post below for the best way to use Tailwind with Rails.

2. Authentication (Devise)

Unless the project has really specific authentication requirements (like nine.shopping’s auth code approach), I’ll use devise to manage logins.

Alongside this, devise_masquerade is a fantastic plugin to use with your admin area, allowing you to login as other users. This is helpful for debugging account specific issues etc.

3. Email systems

Wether it’s just for ‘forgot password’ emails, pretty much any Rails app I am building is going to send email. There are two handy tools I use for this.

Letter opener web

This gem makes sure you don’t embarrasingly send emails to real users whilst developing or testing, life-saver!

Postmark

Postmark is a service I have been using for years! It’s really easy to integrate into Rails using their postmark-rails gem, plus the product is great, easy to use and very reliable.

4. Admin system

I try to make all of my products as self-serve as possible, requiring as little of my time to set up accounts or keep the product running.

Because of this, having an in-depth admin system to allow me to check on things, block malicious users or make billing changes is necessary.

I usually tend to create these from Scratch, but moving forward I’ve started to use thoughtbot’s administrate gem. It sticks to the Rails conventions of controllers and routing, so it’s easy to customise and add new functionality to.

5. Tests

I am a big fan of TDD and having decent test coverage, this gives me confidence in continuously deploying code and ultimately helps me to develop apps faster.

For testing I use RSpec, along with shoulda-matchers for easily testing model relations & validations.

I use Rails built-in fixtures instead of something like FactoryBot. This is purely for performance reasons, fixtures allow your tests to run much, much faster. Ultimately, I find a fast test suite is more useful and interrupts my workflow a lot less.

6. Rubocop

Sticking with the automated testing side of things, I like to use rubocop to make sure my code is consistent and it also catches some common issues with my code.

I usually follow the Shopify Ruby styleguide with a few minor tweaks.

7. Sentry

Next up is error monitoring with Sentry. Exceptions usually happen in production when real users get a hold of your code, and making sure these are tracked helps a ton in seeing what’s going on and fixing it!

8. Sidekiq

I often don’t set this up right away, but within the first week or two of development comes the time for background jobs. I like to stick with what I know and Sidekiq along with it’s web interface is easy to use and reliable.

9. Metamagic

This one is a small, but very useful gem. It helps set page titles, meta keywords and even open graph tags for sharing on social sites. This is a must if you have a lot of publicly accessible pages and want to start doing some SEO.

<% meta(title: "Sign in to your account") %>
Enter fullscreen mode Exit fullscreen mode

10. Rack attack

The final gem I like to include in all projects is rack-attack. This is a rate limiting tool which is great for throttling dangerous actions in your app to prevent bot attacks or other malicious users.

It works great with APIs, but I also like to use it for login/sign up pages too, like so:

Rack::Attack.throttle("authentication/ip", limit: 30, period: 1.hour) do |req|
  if req.post? &&
       %w[/users/sign_in /users/sign_up /users/password].include?(
         req.path
       )
    req.ip
  end
end
Enter fullscreen mode Exit fullscreen mode
💖 💪 🙅 🚩
phawk
Pete Hawkins

Posted on October 2, 2021

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related