How to create an API using Ruby on Rails

February 02, 2022

Tags: Technologies
ruby
Unsplash

 

In this blog, we will teach you to step by step how to create an API using Ruby on Rails, even without having a greater knowledge of this framework that works with the Ruby language.

 

Step by Step: Create an API Using Ruby on Rails

 

Step 1: Create a Rails API

 

To do this, in the directory of your choice you must write the following code in your terminal. This will allow you to create a new API that will be named secret_menu_api

 

#in your terminal
rails new secret_menu_api --api

 

Next, switch to the API menu by opening it by typing this in your terminal:

 

# in your terminal
cd secret_menu_api

code .

 

Step 2: Enable CORS (Cross Origin Resource Sharing)

 

CORS allows others to access your API. To prevent unwanted access to your API, Rails automatically disables CORS. In the file explorer of your newly created Rails API, expand the following directories to open the cors.rb file.

 

config>initializers>cors.rb

 

So, Uncomment lines 8-16. On line 10, change the code (origins 'example.com') to (origins'*') as shown below:

 

# in config>initializers>cors.rb
# lines 8-16

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins '*'

    resources '*',
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end

 

In the 'explorer' file, scroll down and open Gemfile. Uncomment line 26, gem 'rack-cors':

 

# in Gemfile
gem 'rack-cors'

 

Then in the terminal run:

 

#in terminal
bundle install

 

Step 3: Create the model, controller, database migration table, and route via the Rails g resource command

 

Command syntax:

 

# in terminal
rails g resource Secret_menu_item

 

After doing this, you will notice that this command created the following files (we include the file directory on the second line):

 

A model named secret_menu_item
app>models>secret_menu_item.rb

A controller named secret_menu_items_controller.rb app>controllers>secret_menu_items_controller.rb

A route named routes.rb
config>routes.rb

A database migration table named 202042720449_create_secret_menu_items.rb
db>migrate>202042720449_create_secret_menu_items.rb

NOTE: 202042720449 is just a timestamp, your file could have a different timestamp.

 

Step 4: In this step, you have to specify the attributes and data types of a secret menu item

 

The API was designed to display useful information about items in the secret menu, so we can display such information by setting the following as attributes:

 

  • secret menu item name
  • name of the restaurant offering the secret menu item
  • menu description

 

Specify attributes

 

In your 02042720449_create_secret_menu_items.rb, you are going to copy and paste:

 

# in db>migrate>202042720449_create_secret_menu_items.rb

class CreateSecretMenuItems < ActiveRecord::Migration[6.0]
  def change
    create_table :secret_menu_items do |t|
      t.string :menu_name
      t.string :restaurant_name
      t.string :menu_description
    end
  end
end

 

Migrate your table

 

# in your terminal

rails db:migrate

 

You should see the following in the terminal if the migration was successful:

 

# Message in your terminal

== 20200427020449 CreateSecretMenuItems: migrating =============================
-- create_table(:secret_menu_items)
   -> 0.0022s
== 20200427020449 CreateSecretMenuItems: migrated (0.0023s) ====================

 

In your db directory, you need to open schema.rb. You will notice that this file now shows its data structure.

 

# in db>schema.rb

ActiveRecord::Schema.define(version: 2020_05_03_161829) do

  create_table "secret_menu_items", force: :cascade do |t|
    t.string "menu_name"
    t.string "restaurant_name"
    t.string "menu_description"
  end
end

 

Step 5: Time to define index, display, create, update, and destroy actions

 

All this will allow our API to:

 

  • Index: display instances of menu items in the database
  • Show: reflect instance of a menu item
  • Create: make an instance of the menu
  • Update: update an instance of an existing menu item
  • Delete: get rid of a secret menu item

 

Copy and paste in secret_menu_intems_controller.rb.

 

#in app>controllers>secret_menu_items_controller.rb

class SecretMenuItemsController < ApplicationController
    def index
        @secretMenuItems = SecretMenuItem.all
        render json: @secretMenuItems
    end

    def show
        @secretMenuItem = SecretMenuItem.find(params[:id])
        render json: @secretMenuItem
    end

    def create
        @secretMenuItem = SecretMenuItem.create(
            menu_name:params[:menu_name],
            restaurant_name:params[:restaurant_name],
            menu_description: params[:menu_description]
        )
        render json: @secretMenuItem
    end

    def update
        @secretMenuItem = SecretMenuItem.find(params[:id])
        @secretMenuItem.update(
            menu_name:params[:menu_name],
            restaurant_name:params[:restaurant_name],
            menu_description: params[:menu_description]
        )
        render json: @secretMenuItem
    end

    def destroy
        @secretMenuItems = SecretMenuItem.all
        @secretMenuItem = SecretMenuItem.find(params[:id])
        @secretMenuItem.destroy
        render json: @secretMenuItems
    end

end

 

Step 6 - Create routes to index, show, create, update and destroy actions

 

When talking about routes, we refer to those that receive HTTP requests on the client-side, forwarding these requests to the appropriate actions. To configure them, copy and paste into your route.rb:

 

# in config>routes.rb

Rails.application.routes.draw do
  resources :secret_menu_items, only: [:index, :show, :create, :update, :destroy]
end


Step 7: Seed the data

 

Create instances of the secret menu items in the database:

 

# in db>seed.rb

menu1 = SecretMenuItem.create(menu_name: "Chipotle Nachos", restaurant_name: "Chipotle", menu_description:"Build a plate of nachos with all of your favorite fixings")
menu2 = SecretMenuItem.create(menu_name: "Starbucks butterbeer Frappuccino", restaurant_name: "Starbucks", menu_description:"Combine three pumps of toffee nut syrup and three pumps of caramel with a Crème Frappuccino base")
menu3 = SecretMenuItem.create(menu_name: "Skittles", restaurant_name: "Jamba Juice", menu_description:"A mixture of lemonade, lime sherbet, frozen yogurt, and strawberries")

 

Seed the date

 

# in your terminal
rails db:seed

 

Check if it was done correctly:

 

# in your terminal
rails c

# It will pull up a console
2.6.1 :002 >

 

Type SecretMenuItem.all to extract all instances of the secret menu items that were seeded:

 

# in your terminal

2.6.1 :002 > SecretMenuItem.all
   (0.5ms) SELECT sqlite_version(*)
  SecretMenuItem Load (0.2ms) SELECT "secret_menu_items".* FROM "secret_menu_items" LIMIT ? [["LIMIT", 11]]
 => #<ActiveRecord::Relation [#<SecretMenuItem id: 1, menu_name: "Chipotle Nachos", restaurant_name: "Chipotle", menu_description: "Build a plate of nachos with all of your favorite ...">, #< SecretMenuItem id: 2, menu_name: "Starbucks butterbeer Frappuccino", restaurant_name: "Starbucks", menu_description: "Combine three pumps of toffee nut syrup and three ...">, #<SecretMenuItem id: 3, menu_name: "Skittles", restaurant_name: "Jamba Juice", menu_description: "A mixture of lemonade, lime sherbet, frozen yogurt...">]>

 

If you can see all instances, then all data was successfully seeded.

 

At Rootstack, our expert developers have created APIs to solve the technological problems that our clients present. You can be part of a multicultural team of developers, just apply here and discover the benefits of one of the fastest-growing technology companies in Latin America.

 

We recommend you on video


 

Yes, I liked thiscontent.