Looking for new posts? Head over to my new blog at https://bjcant.dev
In the last few weeks I have been working in the Sinatra and ActiveRecord sections of the Learn program. At the conclusion of this section is a MVC (model, view, controller) web application project using Sinatra and ActiveRecord. For this project I am going to chronicle my process from beginning to end in a multi-part blog miniseries. It’s gonna be great!
In the beginning, there was an outline
The toughest part of any new project is figuring out what to do. I flip-flopped for quite a while before settling on an elegantly simple idea: a concert list. The project is called Concertz, and it will be a web app that shows concert listings for artists. The homepage will display a list of concerts, possibly organized by date and location. If logged in, a user can create and edit artists as well as show listings.
My MVC outline for this project is below. The outline will be updated as the project goes on.
Concertz Outline
MODELS
User
has_many :artists
has_many :concerts #not sure if this is necessary
instance variables
email
password
instance methods
authenticate
Artist
belongs_to :user
has_many :concerts
instance variables
name
instance methods
slug
class methods
find_by_slug
Concert
belongs_to :artist
has_one :user, through: artist
instance variables
concert_date
location
ticket_price
VIEWS
index.erb
- Show upcoming and past concerts
layout.erb
- layout template. Includes login/signup buttons if not logged in. If logged in, concerts sign out button.
Users
login.erb
- Login Page, includes form with email/password for login
signup.erb
- Sign Up Page, includes form with email/password for
sign up
/users/show.erb
- show user information. Includes artists and concerts. Artists headers link to artist page. Include “create artists” button
Artists
/artists/index.erb
- show listing of all artists.
/artists/show.erb
- Show artist info, list concerts belonging to artist. if current_user.id == @artist.user.id, include edit button and delete button and form to add concerts.
/artists/edit.erb
- show form to edit artist
Concerts
/concerts/show.erb
- show info about a particular concert. If logged_in, include edit and delete buttons
/concerts/edit.erb
- show form to edit a particular concert
CONTROLLERS
ApplicationController
GET '/'
- Verify if logged_in. index.erb
helper methods
current_user
logged_in?
UsersController
GET '/users/login'
- Verify if logged_in. If true: login.erb. else: redirect to ‘/’.
POST '/users/login'
- authenticates login. if true: add user_id to session and redirect to ‘/’. if false: redirect to ‘/login’
GET '/users/signup'
- signup.erb
POST '/users/signup'
- authenticate signup. if true: create user, add user_id to session and redirect to ‘/’. if false: redirect to ‘/signup’.
GET '/users/:id'
- verify current_user.id matches params[:id]. If true: users/show.erb . else: redirect to ‘/’.
ConcertsController
GET '/concerts'
- redirect to ‘/’
GET '/concerts/:id'
- ‘concerts/show.erb’
POST '/concerts'
- create new concert instance. redirect to ‘/concerts/:id’
PATCH '/concerts/:id'
- edit concert. redirect to ‘/concerts/:id’
DELETE '/concerts/:id'
- delete concert. redirect to ‘/’
ArtistsController
GET '/artists'
- verify if logged_in ‘/artists/index.erb’
POST '/artists'
- create new Artist through user. redirect to ‘/artists/:slug’
GET '/artists/:slug'
- verify if logged_in. Artist.find_by(slug: params[:slug]). ‘/artists/show.erb’
GET '/artists/:slug/edit'
- verify if logged_in. /artists/edit.erb.
PATCH '/artists/:slug'
- update artist info. redirect to ‘/artists/:slug’
DELETE '/artists/:slug'
- delete artist