[RUBY] Rettung und Rettung_von

Einführung

Ich hatte noch nie einen Programmierfehler, aber da der Entwickler auch ein Mensch ist, kann ich Fehler machen, und ein Netzwerkfehler kann dazu führen, dass der Entwickler einen Fehler macht. Es gibt verschiedene Arten von Fehlern, aber es gibt viele Situationen, in denen Sie einen Prozess schreiben sollten, z. B. "Wenn ein solcher Fehler auftritt, tun Sie dies". In solchen Fällen kann jedoch eine grundlegende Verwendung vonett und Rettungs_von verwendet werden.

rescue Sie können Rettung verwenden, um einen Fehler zu erkennen und zu schreiben, was als Nächstes zu tun ist. Das Folgende ist der Unterschied zwischen dem Fall ohne Rettung und dem Fall mit Rettung.

Die Benutzerklasse erstellt einen Benutzer so, dass er nur eine Namensspalte enthält.

> user = User.new('Yamada')
=> #<User:0x00007ff0fa896758 @name="Yamada">

> user.name
=> "Yamada"

Erstellen Sie eine put_info-Methode in der User-Klasse und führen Sie sie aus.

class UsersController < ActionController::Base

  def puts_info
    "Name ist" + name
  end
end

> user.puts_info
=>Der Name ist Yamada

Fügen Sie der put_info-Methode die nicht vorhandene age-Methode hinzu und führen Sie sie aus.

class UsersController < ActionController::Base

  def puts_info
    "Name ist" + name
    "Alter ist" + age
  end
end

> user.name
=> "Yamada"
> user.puts_info
=> NameError (undefined local variable or method `age' for #<User:0x00007fdeb98f3ed8 @name="Yamada">)

Ich habe einen NameError. Ich werde die Verarbeitung im Falle eines Fehlers mit Rettung schreiben.

class UsersController < ActionController::Base

  def puts_info
    "Name ist" + name
    "Alter ist" + age
  rescue => e
    "Es ist ein Fehler"
  end
end

> user.puts_info
=> "Es ist ein Fehler"

rescue_from

Mit recovery_from können bestimmte Arten oder mehrere Arten von Ausnahmen von einem gesamten Controller und seinen Unterklassen behandelt werden.

Beispiel: Im Falle eines 404-Fehlers (es gibt keine solche Seite) führen Sie die Methode record_not_found aus.

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

Beispiel: Implementieren Sie eine Spezifikation, nach der nur Administratorbenutzer die Bearbeitungsseite aufrufen können

1, Führen Sie auf dem Client-Controller den Berechtigungsprüfungsprozess mit "before_action" aus, bevor Sie die Bearbeitungsaktion ausführen. Führen Sie current_user.admin? In der check_authorization -Methode aus. Wenn Sie kein Administrator sind, verwenden Sie raise, um die Ausnahme User :: NotAuthorized auszulösen.


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, Schreiben Sie einen Prozess, damit ApplicationController im Fall des Fehlers "User :: NotAuthorized" die Methode "user_not_authorized" ausführt.

class ApplicationController < ActionController::Base
  rescue_from User::NotAuthorized, with: :user_not_authorized

  private

    def user_not_authorized
      flash[:error] = "Sie haben keine Berechtigung, auf diese Seite zuzugreifen."
      redirect_back(fallback_location: root_path)
    end
end

Auf diese Weise können Sie im Falle eines Berechtigungsfehlers "Sie haben keine Berechtigung" anzeigen. Sie müssen sich keine Gedanken über Berechtigungen innerhalb der Bearbeitungsaktion machen. Wenn es eine andere Methode als die Bearbeitung gibt, für die Administratorrechte erforderlich sind, können Sie before_action verwenden, um "check_authorization" auszuführen.

Referenz

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

Recommended Posts

Rettung und Rettung_von
== und gleich