Small Reviews and Sinatra: My Hobby and My Assignment

Posted by Norberto Santiago on May 12, 2020

When deciding the theme for my projects, I often think if it would be something I would use. For example, my CLI project was all about looking for breweries in a city. Cause that’s what I do, look for museums at day and breweries at night. I swear, I’ve probably seen more Claude Monet paintings than the total of IPA beers I ever had.

And also this one:

This time, I decided to take things further. Instead of something I would use. Why not do something I would DO for others? That’s when I decided to use my social media movie page as the theme for the Sinatra project. Small Reviews which literally translate to spanish as reseñitas (a quirk in Puerto Rico is to use the diminutive word for everything), it started as a way to show my love for movies and distract myself from deppresion and post Hurricane Maria PTSD. It all started with this post:

As far as the code goes, is a simple project. You’re all LiveJournal probably looks better, but it does everything we need to have a full CRUD functional website. Being a reviews website the Controllers are Appplication Controller, Users Controller, Sessions Controller and Reviews Controller. The typical Session Controller looks like this:

class SessionsController < ApplicationController 

	get "/signup" do
		if logged_in?
			redirect to '/reviews'
		else
		erb :"users/signup"
		end         
    end 

    post "/signup" do
		@user = User.new(:username => params[:username], :email => params[:email], :password => params[:password])
        if @user.save
			session[:user_id] = @user.id
			redirect "/reviews"
		  else
			redirect "/signup"
		  end
    end
    
	get "/login" do
		if logged_in?
			redirect to '/reviews'
		else 
		erb :"users/login"
		end 
	end

    post "/login" do
	    @user = User.find_by(username: params[:username])
		if @user && @user.authenticate(params[:password])
			session[:user_id] = @user.id
			redirect "/reviews"
		else
			redirect "/login"
		end
  end

get "/logout" do
	session.clear
	redirect "/"
end

end

What I would really like to share is the reviews controller. Sinatra can look ugly, we can star with an if statement, then another statement, so on and so on to the point that literally hurts to watch. Thanks to a good friend in the cohort, we figure out how to make it better. Now, it looks like this:

class ReviewsController < ApplicationController

get "/reviews" do
    @reviews = Review.all
    erb :"reviews/index"
end 

get "/reviews/new" do 
    erb :"reviews/new"
end

post "/reviews" do
    @review = Review.new(:title => params[:title], :content => params[:content], :user_id => params[:user_id], :created_at => "#{Time.now}", :updated_at => "#{Time.now}")
    if @review.save
        redirect "/reviews/#{@review.id}"
    else
        redirect "/reviews/new"
    end 
end 

get "/reviews/:id" do
  set_review
  if @review
    erb :"reviews/display"
  else 
    redirect "/reviews"
  end 
end

patch "/reviews/:id" do
  set_review
  if @review && auth_user 
    @review.update(:title => params[:title], :content => params[:content])
    @review.save
    redirect "/reviews/#{@review.id}"
  else 
    redirect "/reviews"
  end
end

get "/reviews/:id/edit" do
  set_review 
  if @review && auth_user
    erb :"reviews/edit"  
  else 
    redirect "reviews/error"
  end    
end

  delete '/reviews/:id/delete' do
    set_review 
    if @review && auth_user
      @review.delete 
      redirect "/reviews"  
    else 
      erb :"reviews/error"
    end    
  end
	

Trust me, is way cleaner it looked before. If you noticed I’m calling set_review and auth_user, it is through Private methods. Private methods are used like Helper methods to simplify your code. I recall doing Private methods in the lab, but never used it again. We need to treat our codes like an art form and get creative with it. Make it look presentable and beautiful. My Private methods look like this:

private 

  def set_review 
    @review = Review.find_by_id(params[:id])
  end
  
  def auth_user 
    @review.user.id == current_user.id
  end 

end 

current_user comes from the Helpers method.

helpers do
		def logged_in?
			!!session[:user_id]
		end

		def current_user
			User.find(session[:user_id])
		end
	end

Take your time, be creative. Then we can celebrate like a Renoir painting.