Following this tutorial
We’re going to build some admin pages for a pretend SAAS product. Feel free to follow along step by step, but you don’t have to.
Create your Rails app
I’ll be working on a Rails app created like this:
rails new super_saas --database=sqlite3
Create some database models to work with
The SAAS app will keep track Products, Customers, Subscriptions, and Receipts.
bin/rails g model product name:string price_cents:integer price_currency:string
bin/rails g model customer name:string
bin/rails g model subscription product:references customer:references starts_at:datetime ends_at:datetime
bin/rails g model receipt subscription:references total_cents:integer total_currency:string
bin/rails db:migrate
I’ll create some fake data using the Rails console.
# bin/rails console
starter = Product.create!(name: "Starter", price_cents: 10_00, price_currency: "USD")
basic = Product.create!(name: "Basic", price_cents: 20_00, price_currency: "USD")
premium = Product.create!(name: "Premium", price_cents: 30_00, price_currency: "USD")
business = Product.create!(name: "Business", price_cents: 40_00, price_currency: "USD")
enterprise = Product.create!(name: "Enterprise", price_cents: 50_00, price_currency: "USD")
ultimate = Product.create!(name: "Ultimate", price_cents: 60_00, price_currency: "USD")
Customer.transaction do
(1..1000).each do |i|
name = %w[Alice Bob Carol Dan][i % 4]
Customer.create!(name: "#{name} #{i}")
end
end
Subscription.transaction do
products = [starter, basic, premium, business, enterprise, ultimate]
beginning_of_day = Time.current.beginning_of_day
Customer.find_each do |c|
start = beginning_of_day + rand(-2..2).months
sub = Subscription.create!(
product: products.sample,
customer: c,
starts_at: start,
ends_at: start + rand(1..3).months
)
Receipt.create!(
subscription: sub,
total_cents: sub.product.price_cents,
total_currency: sub.product.price_currency,
)
end
end
Set up various libraries
I’ll set up Super using the default settings.
I’ll also install money-rails
to handle some of the money stuff.
Let’s begin!