Je n'ai jamais eu d'erreur de programmation, mais comme le développeur est aussi un être humain, je peux faire des erreurs et une erreur réseau peut amener le développeur à faire une erreur. Il existe différents types d'erreurs, mais il existe de nombreuses situations où vous devez écrire un processus tel que "Si une telle erreur se produit, faites ceci", mais c'est une utilisation basique de rescue et rescue_from qui peut être utilisée dans de tels cas.
rescue Vous pouvez utiliser le secours pour détecter une erreur et écrire la marche à suivre. Voici la différence entre le cas sans sauvetage et le cas avec sauvetage.
La classe User crée un utilisateur afin qu'il n'ait qu'une colonne de nom.
> user = User.new('Yamada')
=> #<User:0x00007ff0fa896758 @name="Yamada">
> user.name
=> "Yamada"
Créez une méthode put_info dans la classe User et exécutez-la.
class UsersController < ActionController::Base
  def puts_info
    "Nom est" + name
  end
end
> user.puts_info
=>Le nom est Yamada
Ajoutez la méthode age qui n'existe pas à la méthode put_info et exécutez-la.
class UsersController < ActionController::Base
  def puts_info
    "Nom est" + name
    "L'âge est" + age
  end
end
> user.name
=> "Yamada"
> user.puts_info
=> NameError (undefined local variable or method `age' for #<User:0x00007fdeb98f3ed8 @name="Yamada">)
J'ai un NameError. J'écrirai le traitement en cas d'erreur en utilisant le sauvetage.
class UsersController < ActionController::Base
  def puts_info
    "Nom est" + name
    "L'âge est" + age
  rescue => e
    "C'est une erreur"
  end
end
> user.puts_info
=> "C'est une erreur"
rescue_from
rescue_from permet à certains types ou à plusieurs types d'exceptions d'être traités par un contrôleur entier et ses sous-classes.
record_not_found.class UsersController < ActionController::Base
  rescue_from ActiveRecord::RecordNotFound, with: :record_not_found
  private
    def record_not_found
      render plain: "404 Not Found", status: 404
    end
end
1, sur le contrôleur client, effectuez le processus de vérification des autorisations avec before_action avant d'exécuter l'action d'édition.
Faites current_user.admin? Dans la méthode check_authorization, et si vous n'êtes pas un administrateur, utilisez rise pour lever l'exception ʻUser :: NotAuthorized`.
class ClientsController < ApplicationController
  before_action :check_authorization
  def edit
    @client = Client.find(params[:id])
  end
  private
    def check_authorization
      raise User::NotAuthorized unless current_user.admin?
    end
end
2, écrivez le processus pour exécuter la méthode ʻuser_not_authorized dans le cas de l'erreur ʻUser :: NotAuthorized dans ApplicationController.
class ApplicationController < ActionController::Base
  rescue_from User::NotAuthorized, with: :user_not_authorized
  private
    def user_not_authorized
      flash[:error] = "Vous n'avez pas la permission d'accéder à cette page."
      redirect_back(fallback_location: root_path)
    end
end
En faisant cela, en cas d'erreur d'autorisation, vous pouvez afficher "Vous n'avez pas d'autorisation".
Vous n'avez pas à vous soucier des autorisations dans l'action de modification.
S'il existe une méthode autre que edit qui nécessite des privilèges d'administrateur, vous pouvez utiliser before_action pour exécuter check_authorization.
https://railsguides.jp/action_controller_overview.html#rescue