[RUBY] Erstellen Sie eine Bulletin Board-API mit Zertifizierungsberechtigung in Rails 6 # 13 Grant-Authentifizierungsheader

Erstellen einer Bulletin Board-API mit Authentifizierungsberechtigung in Rails 6 # 12 Zuordnung von Benutzer und Beitrag

Werkseitig reparieren

Ich werde es ab Werk reparieren.

Derjenige, der am meisten fliegt

ActiveRecord::RecordInvalid:
        Validation failed: User must exist

Das ist der Fehler. Dies geschieht, wenn user_id null wird, wenn create (: post) fertig ist.

Lassen Sie es uns zerstören, indem Sie die Fabrik modifizieren.

spec/factories/posts.rb


   factory :post do
     subject { "MyString" }
     body { "MyText" }
+
+    after(:build) do |obj|
+      obj.user = build(:user) if obj.user.nil?
+    end
   end

after (: build) wird nach build oder create ausgeführt. Sie können den Fehler "Benutzer muss vorhanden sein" beseitigen, indem Sie den erstellten Benutzer in post.user einfügen.

Wenn Sie "if obj.user.nil?" Ausführen und einen bestimmten Benutzer wie "create (: post, user: user)" übergeben und erstellen, können Sie außerdem verhindern, dass er durch interne Verarbeitung überschrieben wird. Ich werde.

Auf einfachere Weise können die meisten von ihnen vorerst zerkleinert werden.

spec/factories/posts.rb


   factory :post do
     subject { "MyString" }
     body { "MyText" }
+    user
   end

Diese Methode ist jedoch gut, wenn "create (: post)" ausgeführt wird. Da der Benutzer jedoch mit "nil" zurückkehrt, wenn "build (: post)" ausgeführt wird, wird die erstere unterstützt.

Anforderungsspezifikation und Controller ändern

spec/requests/v1/posts_request_spec.rb


   describe "POST /v1/posts#create" do
+    let(:authorized_headers) do
+      user = create(:user)
+      post v1_user_session_url, params: { email: user.email, password: "password" }
+      headers = {}
+      headers["access-token"] = response.header["access-token"]
+      headers["client"] = response.header["client"]
+      headers["uid"] = response.header["uid"]
+      headers
+    end
     let(:new_post) do
       attributes_for(:post, subject: "create_Probandentest", body: "create_Körpertest")
     end
     it "Der normale Antwortcode wird zurückgegeben" do
-      post v1_posts_url, params: new_post
+      post v1_posts_url, params: new_post, headers: authorized_headers
       expect(response.status).to eq 200
     end
     it "Ein weiterer Fall wird zurückgesandt" do
       expect do
-        post v1_posts_url, params: new_post
+        post v1_posts_url, params: new_post, headers: authorized_headers
       end.to change { Post.count }.by(1)
     end
     it "subject,Körper kehrt korrekt zurück" do
-      post v1_posts_url, params: new_post
+      post v1_posts_url, params: new_post, headers: authorized_headers
       json = JSON.parse(response.body)
       expect(json["post"]["subject"]).to eq("create_Probandentest")
       expect(json["post"]["body"]).to eq("create_Körpertest")
     end
     it "Fehler werden zurückgegeben, wenn der Parameter ungültig ist" do
-      post v1_posts_url, params: {}
+      post v1_posts_url, params: {}, headers: authorized_headers
       json = JSON.parse(response.body)
       expect(json.key?("errors")).to be true
     end
   end

Generieren Sie einen Benutzer und melden Sie sich basierend auf diesen Benutzerinformationen an. Durch Hinzufügen der 3 Schlüssel zur Authentifizierung im Antwortheader zu den Headern und zum Posten können Sie zugreifen, während Sie als Benutzer "create (: user)" authentifiziert werden. Da die Controllerseite jedoch noch nicht repariert wurde, bleibt es ein Fehler.

Controller reparieren

app/controllers/v1/posts_controller.rb


     def create
-      post = Post.new(post_params)
+      post = current_v1_user.posts.new(post_params)
       if post.save

Das obige Update sollte den Test bestehen.

Um das Verhalten zu erklären, kann der Controller zunächst die Methode current_v1_user verwenden, da die Authentifizierungsinformationen von Headern übergeben werden. Dadurch wird die angemeldete Benutzerinstanz zurückgegeben. Mit anderen Worten, "current_v1_user.posts.new" instanziiert den Beitrag, der dem angemeldeten Benutzer zugeordnet ist. Dadurch wird ein Beitrag für den angemeldeten Benutzer erstellt.

Der authentifizierte Header-Erfassungsprozess von rspec wurde an den Helfer verschoben

Der Test ist bestanden, aber wenn Sie bei der zukünftigen Implementierung von Pundit und der Autorisierung den Prozess schreiben, um den authentifizierten Header jedes Mal abzurufen, nimmt die Wartbarkeit ab. Wechseln Sie daher zur Spezifikation zum Helfer. Ich werde.

Der Helfer für spec befindet sich normalerweise in spec / support. Erstellen Sie daher ein Verzeichnis.

$ mkdir spec/support
$ touch spec/support/authorization_spec_helper.rb

Ich werde die für rspec geeignete Verarbeitung an diesen Ort bringen.

spec/support/authorization_spec_helper.rb


# frozen_string_literal: true

#
#Helfer für die Authentifizierung
#
module AuthorizationSpecHelper
  def authorized_user_headers
    user = create(:user)
    post v1_user_session_url, params: { email: user.email, password: "password" }
    headers = {}
    headers["access-token"] = response.header["access-token"]
    headers["client"] = response.header["client"]
    headers["uid"] = response.header["uid"]
    headers
  end
end

Wenn Sie es nur unter spec / support platzieren, wird es nicht von selbst gelesen. Ändern Sie daher spec / rails_helper.rb.

spec/rails_helper.rb


-# Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }
+Dir[Rails.root.join("spec", "support", "**", "*.rb")].sort.each { |f| require f }
...
 RSpec.configure do |config|
...

+  config.include(AuthorizationSpecHelper, type: :request)
 end

Aktivieren Sie den auskommentierten Lesevorgang unter spec / support und schließen Sie AuthorizationSpecHelper ein. Wenn Sie wie oben schreiben, ist nur die Anforderungsspezifikation gültig.

spec/requests/v1/posts_request_spec.rb


...
 require "rails_helper"
 
 RSpec.describe "V1::Posts", type: :request do
+  let(:authorized_headers) do
+    authorized_user_headers
+  end
...
   describe "POST /v1/posts#create" do
-    let(:authorized_headers) do
-      user = create(:user)
-      post v1_user_session_url, params: { email: user.email, password: "password" }
-      headers = {}
-      headers["access-token"] = response.header["access-token"]
-      headers["client"] = response.header["client"]
-      headers["uid"] = response.header["uid"]
-      headers
-    end
...

Der Rest wird mit der obigen Korrespondenz abgeschlossen. Wenn das Testergebnis grün bleibt, ist es vorerst in Ordnung.

Alle Tests bestehen, aber der Testcode ist in erster Linie unzureichend. Wenn Sie auf #create klicken, wenn Sie nicht authentifiziert sind, wird ein Fehler von 500 angezeigt, und die aktuellen Spezifikationen, mit denen Sie andere Beiträge als Sie selbst aktualisieren oder löschen können, sind problematisch. Daher werde ich beim nächsten Mal endlich die Autorisierung hinzufügen.

Nächstes Mal werden wir den Samen pflegen. Das ist alles für heute.

Fortsetzung

Erstellen einer Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 14 Anzeigen der Anzeige der Ausführungszeit [Zur Serialisierungstabelle]

Recommended Posts

Erstellen Sie eine Bulletin Board-API mit Zertifizierungsberechtigung in Rails 6 # 13 Grant-Authentifizierungsheader
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 17. Fügen Sie Administratorrechte hinzu
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung im Rails 6 # 5-Controller und leiten Sie die Implementierung weiter
Einführung von # 10 devise_token_auth zum Erstellen einer Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6
Einführung des Experten Nr. 15 zum Erstellen einer Bulletin-Board-API mit Zertifizierung und Autorisierung in Rails 6
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 14 Seed. Anzeige der Ausführungszeit
# 16 Richtlinieneinstellung zum Erstellen einer Bulletin Board-API mit Zertifizierungsberechtigung in Rails 6
# 8 Seed-Implementierung zum Erstellen einer Bulletin Board-API mit Zertifizierungsautorisierung in Rails 6
Einführung des Serializers Nr. 9 zum Erstellen einer Bulletin-Board-API mit Zertifizierung und Autorisierung in Rails 6
Erstellen Sie eine Bulletin-Board-API mit Autorisierung in Rails 6 # 12 Assoziation von Benutzer und Beitrag
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 6. Zeigen Sie, erstellen Sie die Implementierung
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 2 Einführung in Git und Rubocop
Erstellen Sie eine Bulletin Board-API mit Zertifizierungsberechtigung im Rails 6 # 7-Update und zerstören Sie die Implementierung
Erstellen Sie eine Bulletin-Board-API mit Autorisierung in Rails 6 # 11. Benutzermodelltest und Validierung hinzugefügt
Erstellen Sie mit Rails 6 # 18 eine Bulletin-Board-API mit Zertifizierung und Autorisierung. ・ Implementierung des Endbenutzer-Controllers
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung mit Rails 6 # 3 RSpec. FactoryBot wird eingeführt und ein Post-Modell erstellt
# 4 nach Validierung und Testimplementierung zum Erstellen einer Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6
Fügen Sie eine Suchfunktion in Rails hinzu.
Ich habe versucht, mit Rails eine Gruppenfunktion (Bulletin Board) zu erstellen
Versuchen Sie, ein Bulletin Board in Java zu erstellen
Fügen Sie mit Gradle ein Projekt in einen beliebigen Ordner ein
So erstellen Sie eine API mit GraphQL und Rails
[Hinweis] Erstellen Sie eine Python3-Umgebung mit Docker in EC2
[So fügen Sie ein Video mit Rails in haml ein]
Build Rails (API) x MySQL x Nuxt.js Umgebung mit Docker
[Ruby on Rails] Fügen Sie eine Spalte mit externen Schlüsselbeschränkungen hinzu
Erstellen Sie einen SlackBot mit AWS Lambda & API Gateway in Java
Ich bin auf einen Typen mit zwei Punkten in Rails gestoßen
So richten Sie einen Proxy mit Authentifizierung in Feign ein
Japanisieren Sie mit i18n mit Rails
Implementieren Sie die LTI-Authentifizierung in Rails
[Implementierungsverfahren] Erstellen Sie eine Benutzerauthentifizierungsfunktion mithilfe von Hexerei in Rails
Ich habe versucht, die Rails-API mit TDD von RSpec zu implementieren. Teil2 -Benutzerauthentifizierung-
So benennen Sie ein Modell mit externen Schlüsseleinschränkungen in Rails um
Ich habe versucht, die Rails-API mit TDD von RSpec zu implementieren. Teil3-Aktionsimplementierung mit Authentifizierung
Schritte zum Erstellen einer Ruby on Rails-Entwicklungsumgebung mit Vagrant