DEV Community

James Shipman
James Shipman

Posted on

Final Project - rails backend initalization

Summary

So I want to begin by saying this has been the most dificult aspect of bootcamp thus far; user authentication. It's a deep subject, it's dense and it really tested how much I had learned in such a short amount of time. That being said, I finally found a great tutorial series that explained it beautifully. Edutechional's React + Rails API Authentication video series. Here's the link, check it out, it's amazing and helped me finally grasp the basics of this concept. Here's the link to the series on youtube: https://www.youtube.com/playlist?list=PLgYiyoyNPrv_yNp5Pzsx0A3gQ8-tfg66j

Okay so this post will be a summary of what I learned and act as a reference guide for myself for future projects, and hopefully will be a guide for someone else as well.

Rails as the backend

Though rails has an -api only way of creation, the above mentioned series and a few other sources as well in fact, it seems to me that a decent number of devs out there find it is easier to implement an api build when it's not just and api build. Something to do with dependancies and things that are beyond the scope of this blog (and my understanding at the time of writing this blog frankly).

Step 1: create the rails app

I will do my best to make note of where names are specific to my applicaiton and what things are needed as is for the build to work.

# rails new <app_name_here> --database=postgresql
rails new familicule_api --database=postgresql
Enter fullscreen mode Exit fullscreen mode

This gets the ball rolling on things and may take a moment or two depending on your system.

Step 2: gems

I like awesome print, a lot. It makes looking at rails database information, routes, and methods a lot easier, so I have been adding it to all my rails projects as of late.

It easy to do, just open the Gemfile and add gem 'awesome_print', '~> 1.8'. I tend to add it at the top below ruby '2.6.1 but I don't think the location of it is super important as long as it's not placed within the group: ..... sections

The other item that needs to be added to the Gemfile is CORS. This gem does a lot of things, most of which are still a mystery to me. I've added gem 'rack-cors', :require => 'rack/cors' at the bottom of the Gemfile -- again, not sure if it really is important where these go; please comment if you do.

Finally, bcrypt. Lets make sure it's going to bundle install the latest version gem 'bcrypt', '~> 3.1', '>= 3.1.12' update to that and all should be good.

Step 3: CORS and Sessions

Create a cors file that allows for locahost for now but later we will need to also allow deployment server(s)

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'http://localhost:3000'
    resource '*', headers: :any, methods: [:get, :post, :put, :patch, :delete, :options, :head], credentials: true
  end

  # allow do
  #   origins 'https://api.herokuapp.com' 
  #   resource '*', headers: :any, methods: [:get, :post, :put, :patch, :delete, :options, :head], credentials: true
  # end
end
Enter fullscreen mode Exit fullscreen mode

Session Store is another initalizer which defines what the cookie is going to be called on a local system and the domain the cookie is tied to.

if Rails.env == 'production' 
  Rails.application.config.session_store :cookie_store, key: '_familicule_app', domain: 'familicule-api.herokuapp.com'
else 
  Rails.application.config.session_store :cookie_store, key: '_familicule_app'
end 
Enter fullscreen mode Exit fullscreen mode

Skipping ahead a little; the conditional allows for a localhost for testing and a deployed domain for deployment.

Step 4: Basic route and controller

The last two files to create so that we can test that this rails app can be spun up are a route in the routes.rb file and a controller called static_controller.rb.

In routes.rb:

root to: 'static#home'
Enter fullscreen mode Exit fullscreen mode

This creates a route for the browser to look at a controller called static at it's root level.

The static_controller.rb will one def, home (to match the static#home in the routes.rb file).

class StaticController < ApplicationController
  def home
    render json: { status: "It's working" }
  end 
end
Enter fullscreen mode Exit fullscreen mode

Spin up the rails server rails s -p 3001.

Note: I spin the rails server up on port 3001 so it won't conflict with the react server later.

Go to localhost:3001 in your browser and you'll be greeted by a simple rendered json object. {"status":"It's working"}

At this point it's a great time to initialize this backend into github. I won't cover that little step here in this blog (maybe a furture blog), but this will make a perfect master branch. All future steps are in upcoming blog posts - I'm doing this so that this guide isn't a mile long.

Top comments (0)