C'est la fin de la sérialisation en 18 parties.
Cette fois, nous allons créer un contrôleur utilisateur. C'est une compilation du passé, nous vous recommandons donc de l'essayer sans regarder l'exemple de code.
Il est principalement destiné aux administrateurs pour gérer les utilisateurs et en tant que groupe de fonctions permettant aux utilisateurs de se mettre à jour et de se supprimer.
Je vais poursuivre la procédure.
$ rails g controller v1/users
Voici un groupe de fichiers qui ont été légèrement modifiés pour que rubocop ne se fâche pas.
app/controllers/v1/users_controller.rb
# frozen_string_literal: true
module V1
  #
  #  users controller
  #
  class UsersController < ApplicationController
  end
end
spec/requests/v1/users_request_spec.rb
# frozen_string_literal: true
require "rails_helper"
RSpec.describe "V1::Users", type: :request do
end
Appuyez sur la commande pour créer un fichier.
$ rails g pundit:policy user
Après avoir apporté des modifications mineures pour que rubocop ne se fâche pas, il est terminé pour le moment.
app/policies/user_policy.rb
# frozen_string_literal: true
#
#classe de stratégie utilisateur
#
class UserPolicy < ApplicationPolicy
  #
  # scope
  #
  class Scope < Scope
    def resolve
      scope.all
    end
  end
end
spec/policies/user_policy_spec.rb
# frozen_string_literal: true
require "rails_helper"
RSpec.describe UserPolicy, type: :policy do
  let(:user) { User.new }
  subject { described_class }
  permissions ".scope" do
    pending "add some examples to (or delete) #{__FILE__}"
  end
  permissions :show? do
    pending "add some examples to (or delete) #{__FILE__}"
  end
  permissions :create? do
    pending "add some examples to (or delete) #{__FILE__}"
  end
  permissions :update? do
    pending "add some examples to (or delete) #{__FILE__}"
  end
  permissions :destroy? do
    pending "add some examples to (or delete) #{__FILE__}"
  end
end
Examen des spécifications.
Voici la mise en œuvre dans cet esprit.
spec/policies/user_policy_spec.rb
# frozen_string_literal: true
require "rails_helper"
RSpec.describe UserPolicy, type: :policy do
  let(:user) { create(:user) }
  let(:another_user) { create(:user) }
  let(:admin_user) { create(:user, :admin) }
  subject { described_class }
  permissions :index?, :create?, :destroy? do
    it "Non autorisé lorsqu'il n'est pas connecté" do
      expect(subject).not_to permit(nil, user)
    end
    it "Non autorisé lorsque vous êtes connecté en tant qu'utilisateur non administrateur" do
      expect(subject).not_to permit(user, user)
    end
    it "Autorisé lorsque vous êtes connecté en tant qu'utilisateur administrateur" do
      expect(subject).to permit(admin_user, user)
    end
  end
  permissions :show?, :update? do
    it "Non autorisé lorsqu'il n'est pas connecté" do
      expect(subject).not_to permit(nil, user)
    end
    it "Non autorisé lors de la connexion mais avec un autre utilisateur" do
      expect(subject).not_to permit(user, another_user)
    end
    it "Autorisé lorsque vous êtes connecté en tant qu'utilisateur administrateur" do
      expect(subject).to permit(admin_user, user)
    end
    it "Autorisé une fois connecté et le même utilisateur" do
      expect(subject).to permit(user, user)
    end
  end
end
Le fait est qu'un autre utilisateur appelé ʻanother_user` est défini. Maintenant, nous n'avons pas défini de politique à ce stade, alors assurez-vous que certains tests sont de la mousse.
app/policies/user_policy.rb
# frozen_string_literal: true
#
#classe de stratégie utilisateur
#
class UserPolicy < ApplicationPolicy
  def index?
    admin?
  end
  def show?
    me? || admin?
  end
  def create?
    admin?
  end
  def update?
    me? || admin?
  end
  def destroy?
    admin?
  end
  private
  def me?
    @record == @user
  end
  #
  # scope
  #
  class Scope < Scope
    def resolve
      scope.all
    end
  end
end
Le but est de définir une méthode privée appelée «me?» Dans user_policy.rb.
Le mien? Dans application_policy.rb comparé @ record.user == @ user avec ʻuser de @ record.  Cependant, cette fois, nous vérifierons si «@ record» et «@ user» correspondent, donc la grammaire anglaise sera «me?» Au lieu de «mine?». De plus, il semble que seul users_controller puisse être comparé à ʻuser lui-même pour le moment, donc je l'ai proposé à user_policy au lieu de application_policy.
Le test devrait avoir réussi sans aucune mention spéciale. </ div> </ détails>
spec/requests/v1/users_request_spec.rb
# frozen_string_literal: true
require "rails_helper"
RSpec.describe "V1::Users", type: :request do
  before do
    @user = create(:user, name: "test utilisateur")
    @authorized_headers = authorized_user_headers @user
    admin = create(:user, :admin)
    @authorized_admin_headers = authorized_user_headers admin
  end
  describe "GET /v1/users#index" do
    before do
      create_list(:user, 3)
    end
    it "Le code de réponse normal est renvoyé" do
      get v1_users_url, headers: @authorized_admin_headers
      expect(response.status).to eq 200
    end
    it "Le numéro est renvoyé correctement" do
      get v1_users_url, headers: @authorized_admin_headers
      json = JSON.parse(response.body)
      expect(json["users"].length).to eq(3 + 2) #Comprend 2 pour les en-têtes
    end
    it "Les réponses sont renvoyées dans l'ordre décroissant de l'identifiant" do
      get v1_users_url, headers: @authorized_admin_headers
      json = JSON.parse(response.body)
      first_id = json["users"][0]["id"]
      expect(json["users"][1]["id"]).to eq(first_id - 1)
      expect(json["users"][2]["id"]).to eq(first_id - 2)
      expect(json["users"][3]["id"]).to eq(first_id - 3)
      expect(json["users"][4]["id"]).to eq(first_id - 4)
    end
  end
  describe "GET /v1/users#show" do
    it "Le code de réponse normal est renvoyé" do
      get v1_user_url({ id: @user.id }), headers: @authorized_headers
      expect(response.status).to eq 200
    end
    it "le nom est renvoyé correctement" do
      get v1_user_url({ id: @user.id }), headers: @authorized_headers
      json = JSON.parse(response.body)
      expect(json["user"]["name"]).to eq("test utilisateur")
    end
    it "La réponse 404 est renvoyée lorsque l'ID n'existe pas" do
      last_user = User.last
      get v1_user_url({ id: last_user.id + 1 }), headers: @authorized_headers
      expect(response.status).to eq 404
    end
  end
  describe "POST /v1/users#create" do
    let(:new_user) do
      attributes_for(:user, name: "create_test de nom", email: "[email protected]", admin: true)
    end
    it "Le code de réponse normal est renvoyé" do
      post v1_users_url, params: new_user, headers: @authorized_admin_headers
      expect(response.status).to eq 200
    end
    it "Un autre cas sera retourné" do
      expect do
        post v1_users_url, params: new_user, headers: @authorized_admin_headers
      end.to change { User.count }.by(1)
    end
    it "name, email,l'administrateur revient correctement" do
      post v1_users_url, params: new_user, headers: @authorized_admin_headers
      json = JSON.parse(response.body)
      expect(json["user"]["name"]).to eq("create_test de nom")
      expect(json["user"]["email"]).to eq("[email protected]")
      expect(json["user"]["admin"]).to be true
    end
    it "Des erreurs sont renvoyées lorsque le paramètre n'est pas valide" do
      post v1_users_url, params: {}, headers: @authorized_admin_headers
      json = JSON.parse(response.body)
      expect(json.key?("errors")).to be true
    end
  end
  describe "PUT /v1/users#update" do
    let(:update_param) do
      update_param = attributes_for(:user, name: "update_test de nom", email: "[email protected]", admin: true)
      update_param[:id] = @user.id
      update_param
    end
    it "Le code de réponse normal est renvoyé" do
      put v1_user_url({ id: update_param[:id] }), params: update_param, headers: @authorized_headers
      expect(response.status).to eq 200
    end
    it "name, email,l'administrateur revient correctement" do
      put v1_user_url({ id: update_param[:id] }), params: update_param, headers: @authorized_headers
      json = JSON.parse(response.body)
      expect(json["user"]["name"]).to eq("update_test de nom")
      expect(json["user"]["email"]).to eq("[email protected]")
      expect(json["user"]["admin"]).to be false #C'est un problème si l'autorité d'administration peut être réécrite, alors laissez-le comme faux
    end
    it "Des erreurs sont renvoyées lorsque le paramètre n'est pas valide" do
      put v1_user_url({ id: update_param[:id] }), params: { name: "" }, headers: @authorized_headers
      json = JSON.parse(response.body)
      expect(json.key?("errors")).to be true
    end
    it "La réponse 404 est renvoyée lorsque l'ID n'existe pas" do
      last_user = User.last
      put v1_user_url({ id: last_user.id + 1 }), params: update_param, headers: @authorized_admin_headers
      expect(response.status).to eq 404
    end
  end
  describe "DELETE /v1/users#destroy" do
    it "Le code de réponse normal est renvoyé" do
      delete v1_user_url({ id: @user.id }), headers: @authorized_admin_headers
      expect(response.status).to eq 200
    end
    it "Un de moins et revient" do
      expect do
        delete v1_user_url({ id: @user.id }), headers: @authorized_admin_headers
      end.to change { User.count }.by(-1)
    end
    it "La réponse 404 est renvoyée lorsque l'ID n'existe pas" do
      last_user = User.last
      delete v1_user_url({ id: last_user.id + 1 }), headers: @authorized_admin_headers
      expect(response.status).to eq 404
    end
  end
end
Il y a des considérations différentes de celles de la poste.
create (: user) est fait lors de la création de l'en-tête, écrivez le test en tenant compte de ces deux cas.J'intègre autour.
De plus, comme il y a un jugement administratif dans la réponse, il est nécessaire de modifier le sérialiseur.
app/serializers/user_serializer.rb
 # user serializer
 #
 class UserSerializer < ActiveModel::Serializer
-  attributes :id, :name, :email
+  attributes :id, :name, :email, :admin
 end
Maintenant tu es prêt. Ensuite, nous entrerons dans l'implémentation du contrôleur. </ div> </ détails>
Modifiez les routes pour pouvoir accéder au contrôleur.
config/routes.rb
 Rails.application.routes.draw do
   namespace "v1" do
     resources :posts
+    resources :users
     mount_devise_token_auth_for "User", at: "auth"
   end
Vient ensuite le contrôleur. Cela peut être presque détourné de la poste.
app/controllers/v1/users_controller.rb
# frozen_string_literal: true
module V1
  #
  #  users controller
  #
  class UsersController < ApplicationController
    before_action :set_user, only: %i[show update destroy]
    def index
      users = User.order(created_at: :desc).limit(20)
      authorize users
      render json: users
    end
    def show
      authorize @user
      render json: @user
    end
    def create
      user = User.new(user_create_params)
      user[:provider] = :email
      authorize user
      if user.save
        render json: user
      else
        render json: { errors: user.errors }
      end
    end
    def update
      authorize @user
      if @user.update(user_params)
        render json: @user
      else
        render json: { errors: @user.errors }
      end
    end
    def destroy
      authorize @user
      @user.destroy
      render json: @user
    end
    private
    def set_user
      @user = User.find(params[:id])
    end
    def user_create_params
      #Autoriser la définition des privilèges d'administrateur uniquement lors de la création
      params.permit(:name, :email, :admin, :password)
    end
    def user_params
      params.permit(:name, :email, :password)
    end
  end
end
Comme je l'ai écrit dans la section test, l'administrateur ne l'autorise que lors de la création. </ div> </ détails>
c'est tout. Merci d'avoir visité notre site Web 18 fois.
Sur cette base, veuillez développer les fonctions telles que la fonction de commentaire et la connexion sociale.
[Vers la table de sérialisation]
Recommended Posts