How to create an API using Ruby on Rails

February 02, 2022

Tags: Technologies


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.


ruby on rails


What is Ruby on Rails?


Ruby on Rails is an open-source software that users can use to develop applications and collaborate to change their code.


They focus on optimizing their system for the programmers, choosing convention over configuration, which has been risky but certainly works. This framework works excellent with many other technologies and allows HTML, CSS and Java to help display user interfacing. As we said, it’s a simple to use open-source framework that integrates well with other technologies and has a growing community that’s always willing to help.


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.




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]


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


# in Gemfile
gem 'rack-cors'


Do you need an API expert for your project?

Hire the best dedicated software developers here!


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

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

A route named routes.rb

A database migration table named 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


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"


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

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

    def create
        @secretMenuItem = SecretMenuItem.create(
            menu_description: params[:menu_description]
        render json: @secretMenuItem

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

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



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]

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