Make sure you are running a Ruby version supported by Heroku to make your app easier to deploy later. At the time of writing, that is:
- 2.6.7
- 2.7.3
- 3.0.1
You can check your Ruby version with:
rvm list
If you don't have a supported version, install one using RVM (this will take a while):
rvm install 2.7.3
rvm use 2.7.3 --default
You will also need Postgresql installed for the database in order to deploy your app to Heroku later. Check if Postgres is installed and running:
psql -p 5432 -h localhost -U postgres
Once connection is verified, you can quit by typing:
\q
Create Rails API:
rails new project-server --api -T --database=postgresql
Here's what those option flags mean:
--api
: Generate a project in API mode (no sessions/cookies; no view helpers; etc).--database=postgresql
: Use Postgresql as the database. Optional, but if you plan on deploying, you must use Postgresql.-T
: Skip test files.
Add the jwt
gem if you plan on implementing auth:
bundle add jwt
Add Active Model Serializers
gem for serializing your JSON response:
bundle add active_model_serializers
Uncomment bcrypt
and rack-cors
gems in Gemfile:
# Gemfile
# Use Active Model has_secure_password
gem 'bcrypt', '~> 3.1.7'
# Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible
gem 'rack-cors'
And install:
bundle install
Set up CORS config to allow requests from your frontent to your backend:
# config/initializers/cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins '*' # change this when you deploy, please!
resource '*',
headers: :any,
methods: [:get, :post, :put, :patch, :delete, :options, :head]
end
end
Generate a User model (make sure your model has a password_digest
field so
that bcrypt
will work; otherwise the attributes on your user model are up to
you):
rails g resource User username password_digest image bio
Add password logic to model, and optionally, validations:
# app/models/user.rb
class User < ApplicationRecord
has_secure_password
validates :username, uniqueness: { case_sensitive: false }
end
Create seed data:
# db/seeds.rb
User.create(
username: "Ian",
password: "123",
bio: "Lead Instructor",
image: "https://cdn.business2community.com/wp-content/uploads/2017/08/blank-profile-picture-973460_640.png"
)
Setup database:
rails db:create db:migrate db:seed
Test:
rails c
> User.first
=> #<User id: 1, username: "Ian", password_digest: [FILTERED], bio: "Lead Instructor" ...>
- Create routes
- Create controllers
- Add additional models
- Add serializers for models
- ???
- Profit