The Sinatra Project: Pizza Hub
Tags: codenewbie, beginners, ruby
Published: 2020-03-30 06:09:30

Ahhhh- pizza! The combination of flavors and textures makes it the perfect comfort food. I must have been craving some because when it was time to choose a meaningful idea for a Collection Management System project, the choice was obvious- I would create an app using MVC and Sinatra ActiveRecord with full CRUD capabilities that would allow a user to create, read, update, and delete **pizzas**. 

How exciting! This was where I could put everything that I have learned so far into action. Although I would love to discuss every detail of this project since I had so much fun working on it, for the sake of time I will just highlight a few things I found to be notable.

To start, I was delighted to hear about a gem called Corneal that would help me get this project going. Until this point, I had been building everything from scratch. It was really cool that when I initialized this project, Corneal took care of the basic scaffolding for my app. And since the general framework was already created, I was really able to focus on actualizing all of the ideas that I had swirling inside my imagination. 

As I was building this basic project, it was impressive that the Models are quite bare with the exception of inheriting from ActiveRecord::Base and the presence of a few powerful macros. The *has_many* and *belongs_to* relationships are established here, allowing for associations between users and pizzas as well as many methods made available through ActiveRecord. I used **bcrypt** for password encryption, so the *has_secure_password* macro was also included in my User class.

In this project, I used:
+ *.create* to **create** a user or a pizza

+ *.find_by_id* and *.all* to **read** users or pizzas 

+ *.update* to **update** a pizza

+ *.destroy* to **delete** a pizza

*Stretch goal: add .update and .destroy functionality to User*

It was helpful to keep in mind the flow of a Sinatra request and RESTful convention as I was building the routes within the Controllers.

Building out the Views was quite interesting- I think **.erb** is really neat and I have very little HTML and CSS experience. This is an area that I used up a lot of time playing around with small visual and functional details. Also, I did run into an issue regarding the use of a *textarea* tag vs an *input* tag with *type="text"* inside the form used to create a pizza. In the case of the *input* tag, the data entered by the user will populate into the form shown via the *'/pizzas/edit'* route, but the data within the *textarea* doesn't without the use of additional code. Any ideas?

*Stretch goal: figure out how to get user data from textarea*

Here is a look at the home page as shown when a User is logged in. The top nav bar is not shown if user not valid or logged in. 

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/jkih8hqhbjcru1c2id0p.png)

To achieve that, I wrapped the nav bar code with the following inside the **layout.erb** file:

    <% if Helpers.logged_in?(session) %/>
           #html code for the nav bar 
    <% end %>

and the following inside the **helpers.rb** file:

    def self.logged_in?(session)
        !!session[:user_id]
    end

*Stretch goal: add full functionality for Ingredient MVC*

The code below was placed inside the User model to validate the presence of and uniqueness of both the User's user name and email:

    validates :user_name, presence: true, uniqueness: true
    validates :email, presence: true, uniqueness: true

This project is still under construction, even though at this point I have covered the basic requirements. A User can sign up, login, create, read, update, and destroy pizzas. A User must have a unique username and email, and can only update and destroy pizzas that belong to that User. 

*Stretch goal: improve styling and overall user experience*

Stay tuned for more updates as they happen!

######Photo by <a href="/photographer/pixaio-75844">pixaio</a> from <a href="https://freeimages.com/">FreeImages</a>