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