DEV Community

Cover image for 10 things I add to every Rails app
Pete Hawkins
Pete Hawkins

Posted on

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

Top comments (5)

Collapse
 
spaquet profile image
Stephane Paquet

I would say that you can do mail testing with mailcatcher. I have put together a docker image to make it easier to add to any project (any language): hub.docker.com/r/stpaquet/alpinema...

I also like Honeybadger and AppSignal for app monitoring. But think that you are right, Sentry is very good and their free tier very appealing.

Collapse
 
phawk profile image
Pete Hawkins

I hope this has been useful, please let me know if there’s anything else you like to include in every one of your Rails apps.

Collapse
 
phawk profile image
Pete Hawkins

Thanks for sharing Leonid! ViewComponent is awesome, I've been using it on my last couple of projects, I think it’s something I'll be using more often as well.

Collapse
 
leokassio profile image
~:$ leokassio

This list sounds awesome. I am new into Rails (planning to build some little products by myself) and loved to see an experienced dev indicating good tooling.
Thanks for sharing

Collapse
 
andycharles6 profile image
andycharles6

Great list