API на Hanami

API на Hanami

1. Установка Hanami: Чтобы установить Hanami, вам нужно иметь установленный Ruby и RubyGems. Затем вы можете использовать команду gem install hanami в терминале. Это установит последнюю версию Hanami и добавит его в список гемов вашего проекта.

2. Создание нового приложения: После установки Hanami, вы можете создать новое приложение командой hanami new my_api. Это создаст новую директорию с именем my_api, в которой будут созданы файлы конфигурации и структура директорий для вашего приложения.

3. Настройка подключения к базе данных: В файле config/environment. rb вы можете настроить подключение к базе данных для вашего приложения. Этот файл содержит конфигурацию для различных окружений, таких как development, test и production.

4. Создание модели: После того, как вы настроили подключение к базе данных, вы можете создать модель для сущности, которую вы хотите использовать в API. Вы можете сделать это, используя команду hanami generate model . Это создаст новый файл модели в директории app/models и добавит необходимые миграции для создания соответствующей таблицы в базе данных.

5. Создание контроллера: Чтобы создать контроллер для API, вы можете использовать команду hanami generate controller . Это создаст новый файл контроллера в директории app/controllers и добавит шаблонный код для обработки HTTP-запросов.

6. Определение методов и экшенов: В контроллере вы можете определить методы (например, index, show, create, update, delete) и экшены для каждого метода.

  • Модель Task:
class Task < Hanami::Entity attributes :title, :description, :done end

Контроллер TasksController:

module Web module Controllers module Api module V1 class TasksController include Web::Action before :authenticate! def initialize(task_repo: TaskRepository.new) @task_repo = task_repo end def call(params) case params[:action] when 'index' index when 'show' show(params) when 'create' create(params) when 'update' update(params) when 'delete' delete(params) end end def index @tasks = @task_repo.all self.body = JSON.generate(@tasks) end def show(params) @task = @task_repo.find(params[:id]) self.body = JSON.generate(@task) end def create(params) @task = @task_repo.create(task_params(params)) self.body = JSON.generate(@task) end def update(params) @task = @task_repo.update(params[:id], task_params(params)) self.body = JSON.generate(@task) end def delete(params) @task_repo.delete(params[:id]) self.body = JSON.generate(message: 'Task has been deleted') end private def task_params(params) params.require(:task).slice(:title, :description, :done) end end end end end end

Для роутинга добавить в файл config/routes. rb:

Hanami.application.routes do get '/tasks', to: 'api/v1/tasks#index' get '/tasks/:id', to: 'api/v1/tasks#show' post '/tasks', to: 'api/v1/tasks#create' put '/tasks/:id', to: 'api/v1/tasks#update' delete '/tasks/:id', to: 'api/v1/tasks#delete' end

Тестирование метода create:

# spec/web/controllers/api/v1/tasks_controller_spec.rb RSpec.describe Web::Controllers::Api::V1::TasksController, type: :action do let(:task_repo) { TaskRepository.new } let(:valid_params) { { task: { title: 'Task Title', description: 'Task Description' } } } let(:invalid_params) { { task: { title: '' } } } describe 'POST #create' do context 'with valid params' do it 'creates a new task' do action = described_class.new(task_repo: task_repo) response = action.call(valid_params) expect(task_repo.all.size).to eq(1) expect(response[0]).to eq(201) expect(response[1]['Content-Type']).to include('application/json') expect(response[1]['Location']).to include("/tasks/#{task_repo.last.id}") end end context 'with invalid params' do it 'renders a JSON response with errors for the new task' do action = described_class.new(task_repo: task_repo) response = action.call(invalid_params) expect(response[0]).to eq(422) expect(response[1]['Content-Type']).to include('application/json') end end end end

Больше материалов на канале @rubyhub

1
Начать дискуссию