Depuis que j'ai fait un modèle la dernière fois, je vais implémenter un contrôleur cette fois.
$ rails g controller v1/posts
Une fois exécuté, un contrôleur et un fichier de spécification de demande seront générés.
Pour le moment, implémentez le contrôleur comme suit.
app/controllers/v1/posts_controller.rb
# frozen_string_literal: true
module V1
#
# post controller
#
class PostsController < ApplicationController
before_action :set_post, only: %i[show update destroy]
def index
# TODO
end
def show
# TODO
end
def create
# TODO
end
def update
# TODO
end
def destroy
# TODO
end
private
def set_post
@post = Post.find(params[:id])
end
def post_params
params.permit(:subject, :body)
end
end
end
Créez un contrôleur selon CRUD une fois sans logique. De plus, couper l'espace de noms appelé V1 est une méthode souvent utilisée dans le développement d'API. Cela facilite la séparation et le développement lors de la création de la version 2 qui n'est pas rétrocompatible.
Ensuite, définissez les itinéraires.
config/routes.rb
# frozen_string_literal: true
Rails.application.routes.draw do
+ namespace "v1" do
+ resources :posts
+ end
end
Cela définira les routes CRUD. Allons vérifier.
$ rails routes
...
Prefix Verb URI Pattern Controller#Action
v1_posts GET /v1/posts(.:format) v1/posts#index
POST /v1/posts(.:format) v1/posts#create
v1_post GET /v1/posts/:id(.:format) v1/posts#show
PATCH /v1/posts/:id(.:format) v1/posts#update
PUT /v1/posts/:id(.:format) v1/posts#update
DELETE /v1/posts/:id(.:format) v1/posts#destroy
...
Comme d'habitude, implémentez d'abord le test. En tant que comportement
J'irai. Je n'inclurai pas de pager pour un simple didacticiel d'application de test, mais je pourrais écrire un article dans le futur.
spec/requests/v1/posts_controller.rb
# frozen_string_literal: true
require "rails_helper"
RSpec.describe "V1::Posts", type: :request do
describe "GET /v1/posts#index" do
before do
create_list(:post, 3)
end
it "Le code de réponse normal est renvoyé" do
get v1_posts_url
expect(response.status).to eq 200
end
it "Le numéro est renvoyé correctement" do
get v1_posts_url
json = JSON.parse(response.body)
expect(json["posts"].length).to eq(3)
end
it "Les réponses sont renvoyées dans l'ordre décroissant de l'identifiant" do
get v1_posts_url
json = JSON.parse(response.body)
first_id = json["posts"][0]["id"]
expect(json["posts"][1]["id"]).to eq(first_id - 1)
expect(json["posts"][2]["id"]).to eq(first_id - 2)
end
end
end
create_list (: post, 3)
est le processus de création de 3 messages et de leur sauvegarde dans la base de données.En d'autres termes, pour résumer le comportement, LIGNE 10: il "Le code de réponse normal est renvoyé" Début du bloc LIGNE 8: 3 messages sont enregistrés LIGNE 11: Faites une demande d'obtention à v1_posts_url (v1 / posts / index) LIGNE 12: Le code de réponse est: ok (200 normal) LIGNE 13: il "Le code de réponse normal est renvoyé" Fin de bloc. Revenu à 0 enregistrement de publication LIGNE 14: il "Le numéro est renvoyé correctement" Début du bloc LIGNE 8: 3 messages sont enregistrés LIGNE 15: Faire une demande d'obtention à v1_posts_url (v1 / posts / index) LIGNE 16: Convertir response.body en JSON.parse et en tableau Ruby LIGNE 17: Le poste de réponse est de 3 enregistrements LIGNE 18: il "Le numéro est renvoyé correctement" Fin du bloc. Revenu à 0 enregistrement de publication ↓ ...
Ce sera.
À ce stade, le contrôleur n'est pas implémenté, donc bien sûr le test est de la mousse.
Strictement parlant, le test final nécessite une comparaison de created_at, mais une simple comparaison est faite par id. À l'origine, vous devriez également tester la limite, mais l'omettre. Si vous êtes curieux, essayez d'implémenter un test qui fait 21 create_list et confirme que seulement 20 sont renvoyés.
Tips.
En passant, je vais vous présenter la méthode factoryBot que j'utilise souvent.
build (: post)
post est généré 1 enregistrement en mémoire. Il ne sera pas reflété dans la base de données sauf s'il est enregistré. Équivalent à Post.newcreate (: post)
post et enregistrez-le dans la base de données. Équivalent à Post.create!build_list (: post, 5)
Génère 5 enregistrements de message. Plusieurs versions de buildcreate_list (: post, 5)
Créez 5 enregistrements de publication. Plusieurs versions de createDe plus, le test des demandes nécessite les mesures suivantes.
config/application.rb
...
config.hosts << ".amazonaws.com"
+ config.hosts << "www.example.com"
...
Cela est dû au fait que le test rspec est reconnu comme une demande de www.example.com.
app/controllers/v1/posts_controller.rb
...
def index
- # TODO
+ posts = Post.order(created_at: :desc).limit(20)
+ render json: { posts: posts }
end
...
Vous pouvez maintenant obtenir la liste. J'essaierai de frapper l'API avec curl.
$ curl localhost:8080/v1/posts
{"posts":[{"id":2,"subject":"","body":"hoge","created_at":"2020-09-06T01:07:52.628Z","updated_at":"2020-09-06T01:07:52.628Z"},{"id":1,"subject":"hoge","body":"fuga","created_at":"2020-09-05T13:50:01.797Z","updated_at":"2020-09-05T13:50:01.797Z"}]}
Si des données vides sont renvoyées, essayez de créer un enregistrement de publication à partir de rails c
.
Si vous pouvez le faire, n'oubliez pas d'exécuter rubocop et rspec, puis git commit.
[Vers la table de sérialisation]
Recommended Posts