(Примечание: это просто заметки, которые я опубликовал, в основном для себя. Если кто-то еще наткнулся на них и нашел их полезными, отлично. Это предполагает, что вы знаете, как создавать модели, создавать миграции и работать с Ruby, Rake и Active. записи)

Создание серверной части и получение запросов не так плохо, как я думал, это будет в Sinatra. Давайте привыкнем к созданию некоторых базовых функций запроса на выборку на внутреннем сервере.

Допустим, мы собираемся сделать серверную часть приложения для регистрации тренеров покемонов. Нам нужно научиться создавать таблицу и ассоциацию «один ко многим» с покемонами, которые у них есть (оба из которых я добавлю позже). Затем нам нужно добавить инструкторов в базу данных и, наконец, отправить данные во внешний интерфейс приложения через запрос на выборку. (вместе с редактированием и удалением, конечно)

ПОЛУЧИТЬ запросы

Запросы Get, вероятно, являются наиболее часто используемыми запросами для «получения» данных из базы данных, поэтому мы добавим их первыми в файл application_controller.rb.

#application_controller.rb
class ApplicationController::Sinatra
  get "/trainers" do
    trainer = Trainer.all
    trainer.to_json
  end
end

В этой ситуации, когда вы посещаете «URL/тренажер», клиент говорит в первой строке:

«Я хочу, чтобы вы достали данные для тренеров».

Затем Ruby возьмет модели Trainer, выполнит поиск всех тренеров и вернет их клиенту (которое мы присвоили переменной «trainer»). Затем мы взяли бы все данные и использовали .to_json. Это превратит необработанные данные в файл json для использования клиентом.

Это самая простая форма получения данных с сервера. Существуют и другие способы извлечения данных (например, сортировка результатов по алфавиту, ограничение количества результатов и т. д.), но это можно обсудить в другом разделе.

POST-запросы

Приложение было бы бесполезным, если бы мы не могли создавать новые данные и сохранять их в базе данных. Итак, давайте создадим POST-запрос.

Первое, что мы собираемся использовать, — это гем Rack-Contrib. Это позволит нам принимать POST-запросы, отправленные от клиента, и использовать «параметры» для создания рубинового хэша для ActiveRecord для сохранения в базе данных тренера. Включите стойку-контриб в свой Gemfile.rb или запустите «gem install стойку-контриб».

#Gemfile.rb 
gem "rack-contrib", "~> 2.3"

Затем включите это на свой config.ru, чтобы Rack анализировал данные JSON.

#config.ru 
use Rack::JSONBodyParser

Теперь мы можем добавить запрос POST в файл application_controller.rb.

#application_controller.rb
post "/trainers" do
  new_trainer = Trainer.create(
    first_name: params[:first_name],
    last_name: params[:last_name],
    age: params[:age],
    hometown: [:hometown],
    starting_pokemon: [:starting_pokemon],
    bio: [:bio]
  )
  new_trainer.to.json
end

Здесь в первой строке клиент говорит: «Я хочу опубликовать (или добавить) что-то в базу данных trainer». В этом случае мы создаем тренера с именем, фамилией, возрастом, родным городом, начальным покемоном и краткой биографией. Нам не нужно добавлять сюда идентификатор, так как он назначается автоматически при сохранении в базу данных, и нам не нужно иметь коллекцию покемонов тренера, так как мы можем сделать это через ассоциацию таблиц.

Сейчас мы используем метод #create, чтобы создать новый экземпляр, а затем сохранить его в базе данных за один раз. Конечно, вы можете использовать .new для создания экземпляра, а затем метод #save для его отдельного сохранения в базе данных; вы можете добавить дополнительные функции или проверки между ними, но для этой цели #create будет быстрым и простым.

УДАЛИТЬ запросы

Запросы DELETE можно обрабатывать, ориентируясь на идентификатор тренера. URL-адрес, скажем, тренера с идентификатором 5 будет выглядеть так: «/trainer/5, а запрос будет выглядеть следующим образом :

#application_controller.rb
delete "trainer/:id" do
  trainer = Trainer.all.find(params[:id])
  trainer.destroy
  trainer.to_json
)

Здесь клиент говорит: «Я хочу, чтобы вы удалили тренера с идентификатором :id» (в нашем примере это 5).Ruby затем просматривает все инструкторы, чтобы найти инструктора с идентификатором 5. (params[:id] взяв :id в качестве хэша и извлекая значения, в данном случае это 5). Затем метод уничтожения используется для удаления этого тренера таргетинга из базы данных.

ИСПРАВЛЕНИЕ запрос

Запрос исправления аналогичен запросу DELETE тем, что мы нацеливаемся на тренера, используя параметры и их идентификатор:

#application_controller.rb
patch "trainer/:id" do
  trainer = Trainer.all.find(params[:id])
  trainer.update(bio: params[:bio])
end

В этой ситуации, в этом конкретном обновлении, мы хотим изменить биографию указанного тренера. Здесь клиент говорит: «Я хочу, чтобы вы изменили (патч) тренер с идентификатором :id» (опять же, в нашем случае, это будет идентификатор 5). Ruby ищет в базе данных тренеров тренера с идентификатором 5 и использует метод обновления, нацеленный на ключ «био» тренера. Используя params с :bio, новое значение, отправленное клиентом, не обновляется на указанном тренере.

Законченный! Опять же, это самые основы создания базовых запросов на выборку к серверу.