Da ich das letzte Mal ein Modell gemacht habe, werde ich dieses Mal einen Controller implementieren.
$ rails g controller v1/posts
Bei der Ausführung werden eine Controller- und eine Anforderungsspezifikationsdatei generiert.
Implementieren Sie den Controller vorerst wie folgt.
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
Erstellen Sie einmal ohne Logik einen Controller nach CRUD. Darüber hinaus wird das Schneiden des Namespace V1 häufig in der API-Entwicklung verwendet. Dies erleichtert das Trennen und Entwickeln beim Erstellen von Version 2, die nicht abwärtskompatibel ist.
Stellen Sie dann die Routen ein.
config/routes.rb
# frozen_string_literal: true
Rails.application.routes.draw do
+ namespace "v1" do
+ resources :posts
+ end
end
Dadurch werden die CRUD-Routen festgelegt. Lass uns nachsehen.
$ 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
...
Führen Sie den Test wie gewohnt zuerst durch. Als Verhalten
Ich werde gehen. Ich werde Pager nicht einschließen, da es sich um ein einfaches Tutorial für Testanwendungen handelt, aber ich werde möglicherweise in Zukunft einen Artikel schreiben.
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 "Der normale Antwortcode wird zurückgegeben" do
get v1_posts_url
expect(response.status).to eq 200
end
it "Die Nummer wird korrekt zurückgegeben" do
get v1_posts_url
json = JSON.parse(response.body)
expect(json["posts"].length).to eq(3)
end
it "Die Antworten werden in absteigender Reihenfolge der ID zurückgegeben" 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)
ist der Vorgang, bei dem 3 Beiträge erstellt und in der Datenbank gespeichert werden.Mit anderen Worten, um das Verhalten zusammenzufassen, Zeile 10: it "Normaler Antwortcode wird zurückgegeben" Blockstart Zeile 8: 3 Beiträge werden gespeichert Zeile 11: Stellen Sie eine Get-Anfrage an v1_posts_url (v1 / posts / index). Zeile 12: Antwortcode lautet: ok (200 normal) Zeile 13: it "Normaler Antwortcode wird zurückgegeben" Blockende. Rollback auf 0 Post-Datensätze Zeile 14: it "Die Nummer wird korrekt zurückgegeben" Blockstart Zeile 8: 3 Beiträge werden gespeichert Zeile 15: Stellen Sie eine Get-Anfrage an v1_posts_url (v1 / posts / index). Zeile 16: Konvertieren Sie response.body in das Array JSON.parse und Ruby Zeile 17: Der Antwortbeitrag besteht aus 3 Datensätzen Zeile 18: it "Die Nummer wird korrekt zurückgegeben" Blockende. Rollback auf 0 Post-Datensätze ↓ ...
Es wird sein.
Zu diesem Zeitpunkt ist die Steuerung noch nicht implementiert, daher ist der Test natürlich Moos.
Genau genommen erfordert der endgültige Test einen Vergleich von created_at, aber ein einfacher Vergleich erfolgt über id. Ursprünglich sollten Sie auch das Limit testen, aber weglassen. Wenn Sie neugierig sind, implementieren Sie einen Test, der 21 create_list erstellt und bestätigt, dass nur 20 zurückgegeben werden.
Tips.
Übrigens werde ich die factoryBot-Methode vorstellen, die ich oft benutze.
build (: post)
post wird 1 Datensatz im Speicher generiert. Es wird nicht in der Datenbank angezeigt, es sei denn, es wird gespeichert. Entspricht Post.newcreate (: post)
post und speichern Sie ihn in der DB. Entspricht Post.create!build_list (: post, 5)
Generiere 5 Datensätze von post. Mehrere Versionen des Buildscreate_list (: post, 5)
Erstelle 5 Datensätze von post. Mehrere Versionen von createDarüber hinaus erfordert der Anforderungstest die folgenden Maßnahmen.
config/application.rb
...
config.hosts << ".amazonaws.com"
+ config.hosts << "www.example.com"
...
Dies liegt daran, dass der rspec-Test als Anforderung von www.example.com erkannt wird.
app/controllers/v1/posts_controller.rb
...
def index
- # TODO
+ posts = Post.order(created_at: :desc).limit(20)
+ render json: { posts: posts }
end
...
Jetzt können Sie die Liste erhalten. Ich werde versuchen, die API mit Curl zu treffen.
$ 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"}]}
Wenn leere Daten zurückgegeben werden, versuchen Sie, einen Post-Datensatz aus "Rails C" zu erstellen.
Wenn Sie dies tun können, vergessen Sie nicht, rubocop und rspec auszuführen und dann git commit.
Recommended Posts