Основы построения функционального API с помощью Active Record и Sinatra

Довольно часто при создании проектов во время Фазы 1 и Фазы 2 я сталкивался со многими проблемами API, когда ни один API, который я мог найти, не имел всех нужных данных, которые я хотел использовать для своего сайта. Теперь, когда я изучил Sinatra и Active Record, я могу создать свой собственный API, чтобы иметь все данные, которые я когда-либо мечтал использовать. Надеюсь, что после прочтения этой статьи вы тоже сможете создать свой собственный API!

Стартовый код:

Чтобы приступить к созданию собственного API, давайте сначала получим начальный код! Сделайте форк и клонируйте его на свою машину. https://github.com/learn-co-curriculum/phase-3-sinatra-react-project

Для сегодняшнего примера мы будем создавать API для сайта отзывов о фильмах!

Установка пакета

Откройте новый терминал и введите в консоль следующее:

bundle install
Войти в полноэкранный режим Выйти из полноэкранного режима

Это установит все гемы из нашего Gemfile, которые помогут нам создать API. Некоторые из наиболее важных Gem: sinatra, rake, sqlite3, faker и activerecord-reset-pk-sequence.

Создание наших моделей

Перейдите в папку App >> Models и создайте новые файлы movie.rb, review.rb и user.rb. Создание наших моделей не только дает нам возможность создавать обычные методы для выполнения любых действий с нашими данными, но и позволяет нам получить правильные ассоциации (отношения), которые будут играть важную роль в создании нашей базы данных.

После того как вы создали наши модели, давайте дадим им имена классов!

movie.rb:

class Movie < ActiveRecord::Base

end
Вход в полноэкранный режим Выход из полноэкранного режима

review.rb:

class Review < ActiveRecord::Base

end
Войти в полноэкранный режим Выйти из полноэкранного режима

user.rb:

class User < ActiveRecord::Base

end
Войти в полноэкранный режим Выход из полноэкранного режима

Возможно, вам интересно, что делает «ActiveRecord::Base»? По сути, он обеспечивает интерфейс и связь между таблицами нашей реляционной базы данных и программным кодом Ruby, который манипулирует записями базы данных.

Придание нашим моделям ассоциаций друг с другом:

Прежде чем перейти к коду, важно подумать о нашей доменной модели. Модель домена — это, по сути, способ «нарисовать на доске» наши ассоциации между моделями.

Наша доменная модель: movie ---<reviews>-------user.
Глядя на нашу доменную модель, мы можем начать думать об их ассоциациях между собой в псевдокоде.

Теперь давайте перейдем к нашему коду и начнем создавать эти ассоциации!

movie.rb:

class Movie < ActiveRecord::Base
    has_many :reviews
    has_many :users, through: :reviews
end

Вход в полноэкранный режим Выход из полноэкранного режима

user.rb:

class User < ActiveRecord::Base
    has_many :reviews
    has_many :movies, through: :reviews
end

Войти в полноэкранный режим Выход из полноэкранного режима

review.rb:

class Review < ActiveRecord::Base
    belongs_to :movie
    belongs_to :user 
end

Войти в полноэкранный режим Выход из полноэкранного режима

Если вы еще не поняли, мы просто поместили в код то, что написали в псевдокоде, только с некоторым синтаксисом!

Создание миграций:

Следующий шаг нашего путешествия — создание миграций! Миграции дают нам возможность создавать столбцы и ключи в нашей базе данных!

Откройте новый терминал и введите эти строки по одной за раз и нажмите Enter!

rake db:create_migration NAME="create_movies"

rake db:create_migration NAME="create_users"

rake db:create_migration NAME="create_reviews"
Вход в полноэкранный режим Выход из полноэкранного режима

После создания этих миграций зайдите в папку db >> migrate и вы должны увидеть что-то похожее на то, что есть у меня:

Отлично! Мы создали эти миграции для наших таблиц, но как нам создать новые колонки для нашей таблицы?

create_movies.rb:

class CreateMovies < ActiveRecord::Migration[6.1]
  def change
    create_table :movies do |t|
      t.string :title
      t.string :image
      t.integer :release_date
      t.string :genre
    end
  end
end

Вход в полноэкранный режим Выход из полноэкранного режима

ВАУ! Это очень много информации для восприятия, давайте разберем ее пошагово:

Теперь давайте продолжим и создадим каждую миграцию для каждой модели:

create_users.rb:

class CreateUsers < ActiveRecord::Migration[6.1]
  def change
    create_table :users do |t|
      t.string :name
    end
  end
end

Войти в полноэкранный режим Выход из полноэкранного режима

create_reviews.rb:

class CreateReviews < ActiveRecord::Migration[6.1]
  def change
    create_table :reviews do |t|
      t.integer :movie_id
      t.integer :user_id
      t.string :comment
      t.integer :rating

    end
  end
end


Войти в полноэкранный режим Выход из полноэкранного режима

Глядя на нашу миграцию create_reviews.rb, вы можете сказать, в чем разница?

Если вернуться к нашей доменной модели и нашему псевдокоду movie ---<reviews>-------user, то можно увидеть, что наши обзоры принадлежат фильму и пользователю. Создавая колонки для movie_id и user_id, мы добавляем последний кусочек головоломки для создания ассоциаций между нашими моделями.

После создания наших миграций давайте действительно перенесем их в нашу базу данных!

В терминале введите следующее:

rake db:migrate
Войдите в полноэкранный режим Выйти из полноэкранного режима

Отлично, у нас есть наши столбцы, соответствующим образом примененные к нашим таблицам, но теперь как мы можем добавить в них данные?

Добавление данных:

Для того чтобы наш API отображал какую-либо информацию, мы должны дать ему какое-то значение, и один из самых простых способов сделать это — посеять наши данные! Посмотрев на наш каталог файлов, мы увидим начальный файл seeds.rb.

Находясь в нем, давайте создадим наш самый первый фильм!

m1 = Movie.create( 
    title: 'Harry Potter and the Goblet of Fire',
    image: 'https://m.media-amazon.com/images/I/71opdcUCGjL.jpg',
    release_date: 2005,
    genre: 'Fantasy'
)
Вход в полноэкранный режим Выход из полноэкранного режима

Глядя на это, вы уже можете понять, что здесь происходит! Мы создаем экземпляр фильма и придаем нашим ключам, таким как title и image некоторое значение в нашей базе данных! Но что насчет пользователей и рецензий?

Faker:

В данном случае Faker — это рубиновый гем, который позволяет нам случайным образом генерировать имена для наших пользователей, чтобы нам не приходилось постоянно создавать новые экземпляры наших пользователей самостоятельно.

Пользователи:

5.times do 
    User.create(name: Faker::Name.name)
Войти в полноэкранный режим Выход из полноэкранного режима

Это создаст 5 пользователей, и каждому из них будет дано случайно сгенерированное имя!

Отзывы:

r1 = Review.create(comment:"I liked this film very much. It is much darker than the previous outings, but not as faithful to the source material. The only thing I didn't like so much about the book, was the subplot about Hermione trying to help house elves. It was cute, but interfered too much with the dark overtones of the narratives. The film looks dazzling, especially the ballroom scene. Speaking of that scene, I adored that dress that Hermione was wearing, Emma Watson looked unrecognisable in that scene.Also the music by Patrick Doyle this time was beautiful." , rating: 5 , user_id: User.ids.sample , movie_id: m1.id)

Войти в полноэкранный режим Выйти из полноэкранного режима

К сожалению, для нас не существует Faker для создания отзывов, поэтому нам придется создавать свои собственные отзывы!

После того, как вы выполнили все шаги, зайдите в терминал и введите

Теперь у нас есть все необходимые данные для получения на фронтенде! Но как мы можем связать эти данные и использовать вызов fetch для отображения их на лицевой стороне?

Контроллеры

Контроллеры выступают в роли посредника, который позволяет нам создавать пользовательские маршруты при получении данных на фронтенде.

Первое, что мы должны сделать, это перейти в файл app >> controllers >> application_controller.rb и создать класс, наследующий Sinatra.

class ApplicationController < Sinatra::Base
set :default_content_type, 'application/json'

end

Вход в полноэкранный режим Выход из полноэкранного режима

Теперь давайте создадим наши пользовательские маршруты для данных, которые мы хотим отобразить!

get "/movies" do
    movies = Movie.all
    movies.to_json
  end

Вход в полноэкранный режим Выход из полноэкранного режима

Что все это делает?

/:указывает путь маршрута, который мы хотим создать.

А что, если мы хотим включить наших пользователей и наши отзывы в наши фильмы?

get "/movies" do
    movies = Movie.all
    movies.to_json(include: { reviews: {include: :user} }) 
  end
Вход в полноэкранный режим Выйти из полноэкранного режима

Теперь, если вы запустите ваш сервер rake в терминале с помощью rake server и наберете http://localhost:9292/movies в браузере, вы должны увидеть что-то похожее на то, что было у меня!

Вы только что создали свой первый локальный API! Поздравляю!

Оцените статью
devanswers.ru
Добавить комментарий