[RUBY] sauvetage et sauvetage_from

introduction

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.

Exemple: En cas d'erreur 404 (il n'y a pas de telle page), exécutez la méthode 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

Exemple: implémenter une spécification selon laquelle seuls les utilisateurs administrateurs peuvent accéder à la page d'édition

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.

référence

https://railsguides.jp/action_controller_overview.html#rescue

Recommended Posts

sauvetage et sauvetage_from
== et égal