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