This template provides a basic Sinatra application that includes:
- Active Record using sinatra-activerecord
- PostgreSQL for a database
- Sinatra::Reloader to automatically reload modified files during development
- RSpec for unit testing
- Capybara for acceptance testing
- Pry for debugging
# Clone down this template
git clone https://github.com/LaunchAcademy/sinatra-activerecord-starter-kit.git <YOUR_APP_NAME>
# Move into your app's directory
cd <YOUR_APP_NAME>
# Install all the gems
bundle install
# Remove the old git history and start your own
rm -rf .git && git init && git add -A && git commit -m 'Initial commit'
# Copy the example database.yml file over to its intended destination
cp config/database.example.yml config/database.yml
# Once you've edit the database.yml file as needed, you can create the database
rake db:create
Note the last two steps above. This template is set up for using a PostgreSQL database. You will need to create a
config/database.yml
for the application to connect to the database successfully.
Once you've created and configured the config/database.yml
file, you can create the database with the rake db:create
command.
This template uses the sinatra-activerecord gem, which provides the following rails-like rake tasks:
rake db:create # create the database from config/database.yml from the current Sinatra env
rake db:create_migration # create an ActiveRecord migration
rake db:drop # drops the data from config/database.yml from the current Sinatra env
rake db:migrate # migrate the database (use version with VERSION=n)
rake db:rollback # roll back the migration (use steps with STEP=n)
rake db:schema:dump # dump schema into file
rake db:schema:load # load schema into database
rake db:seed # load the seed data from db/seeds.rb
rake db:setup # create the database and load the schema
rake db:test:prepare # Prepare test database from development schema
If you are having trouble with any of these commands, try prefixing them with bundle exec
.
Uses Sinatra Flash
Flash messages allow you to send information across page redirects. However, only short messages may be sent. Long messages or large objects tend to result in the Flash messages being cleared. In the /app/views/layout.erb
, a message box for flash[:notice]
has already been added.
Example:
# app.rb
post '/books' do
# do some logic like save something to the database
flash[:notice] = "Your book was saved!"
redirect '/books/all'
end
get '/books/all' do
# Some code or logic to get all books
erb :'books/index'
# Flash message will appear on this page
end
# HEADS UP - flash does not work if returning a view
get '/books/all' do
flash[:notice] = "This will not appear on the page."
erb :'/books/index'
# No flash message will appear until you navigate to a new page or the page refreshes.
end
Uses Shoulda Matchers
Shoulda Matchers allow for easier testing of Model associations in your unit tests using RSpec.
Example:
# /spec/models/user_spec.rb
require 'spec_helper'
# In this example, a user can have many books,
# but may only belong to a single library.
describe User do
it { should belong_to :library }
it { should have_many :books }
end
# /app/models/user.rb
class User < ActiveRecord::Base
# Note the difference in "belongs_to" here vs. "belong_to" in the spec test.
belongs_to :library
has_many :books
end
Uses Valid Attribute
Valid Attribute allows for the rapid development of tests for validations in your models.
Example:
# /spec/models/user_spec.rb
describe User do
it { should have_valid(:username).when("valid_username", "another_valid_username") }
it { should_not have_valid(:username).when('', nil) }
end
# /app/models/user.rb
class User < ActiveRecord::Base
validates :username, presence: true
end