Rails - Devise - Handling - devise_error_messages


125

Auf meiner Benutzerbearbeitungsseite gibt es eine Zeile wie folgt:

<%= devise_error_messages! %>

Das Problem ist, dass dies keine Fehler ausgibt, wie es der Rest der App normalerweise tut:

<% flash.each do |key, value| %>
    <div class="flash <%= key %>"><%= value %></div>
<% end %>

Meine Frage ist, wie kann ich erreichen, dass die Fehlermeldung des Geräts wie die anderen funktioniert, die flash.each verwenden?

Vielen Dank.


1
Bitte beachten Sie, dass Devise den Flash bereits verwendet, wie es der Rest der App tut. Bei devise_error_messages handelt es sich nicht um Flash-Nachrichten (Informationen von der letzten Seite), sondern um Validierungsfehler von ActiveRecord
Christopher Oezbek,

Antworten:


135

Ich versuche das selbst herauszufinden. Ich habe dieses Problem gerade auf Github https://github.com/plataformatec/devise/issues/issue/504/#comment_574788 angemeldet gefunden

Jose sagt, dass die devise_error_messsages!Methode nur ein Stub ist (obwohl sie eine Implementierung enthält) und dass wir sie überschreiben / ersetzen sollen. Es wäre schön gewesen, wenn irgendwo im Wiki darauf hingewiesen worden wäre, weshalb ich denke, dass es einige Leute wie uns gibt, die geraten haben.

Ich werde also versuchen, das Modul erneut zu öffnen und die Methode neu zu definieren, wobei die Standardimplementierung effektiv überschrieben wird. Ich werde dich wissen lassen, wie es geht.

Aktualisieren

Ja, das funktioniert. Ich app/helpers/devise_helper.rbhabe es so erstellt und überschrieben:

module DeviseHelper
  def devise_error_messages!
    'KABOOM!'
  end
end

Wenn ich das weiß, kann ich die Methode so ändern, dass Fehlermeldungen so angezeigt werden, wie ich es möchte.

Um Ihnen bei der Lösung Ihres ursprünglichen Problems zu helfen: Hier ist das Original devise_helper.rbauf Github . Sehen Sie sich an, wie die Fehlermeldungen durchlaufen werden:

messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join

Das sollte Ihnen den Einstieg erleichtern. :) :)

Ein weiteres Update

Das resourceObjekt ist eigentlich das Modell, das von devise verwendet wird (siehe Abbildung).

resource.class         #=> User
resource.errors.class  #=> ActiveModel::Error

Es scheint auch in einem höheren Bereich definiert zu sein (wahrscheinlich vom Controller), so dass an verschiedenen Stellen darauf zugegriffen werden kann.

Überall in Ihrem Helfer

module DeviseHelper
  def devise_error_messages1!
    resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
  end

  def devise_error_messages2!
    resource.errors.full_messages.map { |msg| content_tag(:p, msg) }.join
  end
end

Deine Ansicht

<div><%= resource.errors.inspect %></div>

Ich habe es gerade versucht, aber das funktioniert nicht. Das Ziel ist es, den Fehler hier auszugeben: <% flash.each do | key, value | %>
AnApprentice

@ColdTree nein, das Ziel ist, dass es wie die Flash-Nachrichten funktioniert . Die Möglichkeit, das Markup zu steuern, ist eine gute Lösung.
Benjamin Atkin

... Ich denke nicht, dass dies die Frage beantwortet, obwohl es eine gute Forschungsarbeit ist.
Deivid

37

Die folgende Lösung funktioniert mit dem neuesten Gerät (4.1.1) und Rails 4.2.6. Aber es ist so einfach, dass ich den Grund nicht sehe, warum es in 10 Jahren nicht funktionieren würde;)

Wenn Sie Ihre Fehlermeldungen recyceln möchten und sie in Ihrer App gleich aussehen lassen möchten, würde ich Folgendes empfehlen (wie ich es mit Michael Hartl gelernt habe):

Teilweise für Fehlermeldungen erstellen: layouts/_error_messages.html.erb Geben Sie folgenden Code ein (hier verwende ich einige Bootstrap 3-Klassen):

<% if object.errors.any? %>
  <div id="error_explanation">
    <div class="alert alert-danger alert-dismissable">
      <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
      <p><strong>This form contains <%= pluralize(object.errors.count, 'error') %>.</strong></p>
      <ul>
        <% object.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  </div>
<% end %>

Jetzt haben Sie etwas Recyclingfähiges und können es auf ganzer Linie verwenden. Anstelle von Standardgeräten:

<%= devise_error_messages! %>

Nennen Sie es in Ihrem Formular so:

<%= render 'layouts/error_messages', object: resource %>

Sie können es in jede Form bringen. Anstatt eine Ressourcenressource zu übergeben, können Sie eine Variable aus Ihrem Formular wie folgt übergeben:

<%= form_for @post do |f| %>
  <%= render 'layouts/error_messages', object: f.object %>  
  <%= f.text_field :content %>
  <%= f.submit %>
<% end %>

1
Wahrscheinlich die beste und intuitivste Antwort aller Zeiten.
Victor

2
Kühle Lösung. pluralize (object.errors.count, 'error' sollte in pluralize geändert werden (object.errors.count, 'error' obwohl
mizurnix

1
@ LukasasMuzyka in dieser Lösung .. muss ich entfernen: validatable from user.rb .. ???
Vishal

1
@ Vishal - nein. Die obige Lösung verwendet einfach anderes HTML, um die Nachrichten anzuzeigen, die keine Mechanik von Devise ändern
Lukasz Muzyka

1
@Vishal Wenn Sie devise verwenden, werden die von Ihnen erwähnten Validierungen bereits ohne zusätzlichen Code durchgeführt. Die obige Lösung besteht nur darin, das Standardverhalten des Geräts zu überschreiben. Sie müssen erst einmal ein Gerät haben, das funktioniert. Sind Sie sicher, dass Sie die Anweisungen zur Integration von devise in Ihr Projekt befolgt haben?
Lukasz Muzyka

22

Ich weiß, dass es eine Weile her ist, seit diese Frage gestellt wurde, aber ich wollte nur kommentieren, was ich gefunden habe. Die beiden Leute, die bereits geantwortet haben, waren eine enorme Hilfe für mich und ich wollte nur einen Beitrag leisten.

Sie werden in ganz Devise sehen, dass Anrufe verwendet werden render_with_scope. Ich glaube, dies ist eine von devise definierte Methode und wendet den aktuellen Bereich grundsätzlich auf die nächste gerenderte Ansicht an.

Warum ist das relevant? Gerät enthält Ihre Fehler in resource.errors( nicht @resource.errors ). Das Gerät funktioniert einwandfrei, wenn Sie es sozusagen sofort verwenden möchten.

Probleme mit diesen Fehlern treten auf, wenn Sie Ihr Benutzerverwaltungsverhalten ändern. Indem Sie ein redirect_tooder render(anstelle von render_with_scope) hinzufügen, bei dem Devise zuvor kein hatte, werfen Sie im Grunde die Fehlermeldungen aus. Dies macht Devise meiner Meinung nach unfreundlich gegenüber Änderungen.

Meine Lösung ist dies

# In application.html.erb
<% flash.each do |name, msg| %>

  # New code (allow for flash elements to be arrays)
  <% if msg.class == Array %>
    <% msg.each do |message| %>
      <%= content_tag :div, message, :id => "flash_#{name}" %>
    <% end %>
  <% else %>

    # old code
    <%= content_tag :div, msg, :id => "flash_#{name}" %>

  <% end %> #don't forget the extra end
<% end %>

und

# Wherever you want Devise's error messages to be handled like 
# your other error messages
# (in my case, registrations_controller.rb, a custom controller)
flash[:notice] = flash[:notice].to_a.concat resource.errors.full_messages

Der letztere Codeblock nimmt die Fehlermeldungen von Devise als Array und hängt sie an flash[:notice](als Array). Jede Nachricht wird zeilenweise ausgedruckt. Wenn ich Zeit habe, werde ich wahrscheinlich ändern, wie Devise mit Fehlermeldungen umgeht, um dies in meiner gesamten App zu tun, da es viel sauberer erscheint, ein Fehlermeldesystem anstelle von zwei zu haben.


3
Vielen Dank dafür, ich habe meinen Kopf gegen die Wand geschlagen, weil ich versucht habe, das zu tun.
Lucas

1
Es ist jetzt 5 Jahre später und diese Antwort hat meinen Speck gerettet. Vielen Dank @ eric-hu.
Marcamillion

12

Ich habe dies ähnlich wie bei YoyoS gelöst, indem ich ein erstellt app/helpers/devise_helper.rbund darin platziert habe:

module DeviseHelper

  # Hacky way to translate devise error messages into devise flash error messages
  def devise_error_messages!
    if resource.errors.full_messages.any?
        flash.now[:error] = resource.errors.full_messages.join(' & ')
    end
    return ''
  end
end

Hat funktioniert!


11

Ich möchte nur ein neues kleines Stück hierher bringen:

Also habe ich einen einfacheren Weg gefunden, um das Ergebnis zu erzielen, das "AnApprentice" wollte.

Wenn Sie etwas innerhalb des Devise-Plug-Ins anpassen möchten, empfehle ich Ihnen dringend, den Code aus "\ Ruby_repertory \ lib \ ruby ​​\ gems \ 1.9.1 \ gems \ devise-version \ app \ controller" zu kopieren | helpers | mailers ... "zu der Datei, die Sie in Ihrem Projekt haben möchten.

[Bearbeiten] Oder Sie können Ihre Datei von den "normalen" Gerätedateien erben lassen ... Wie ... sagen Sie ... Sie möchten nur eine Funktion in der Datei devise / registrations_controller.rb überschreiben, der ersten Zeile Ihrer benutzerdefinierten Benutzer Registrierungscontroller wäre:

class Users::RegistrationsController < Devise::RegistrationsController

[Bearbeiten 7. August 2013] Jetzt bietet Devise sogar ein Tool zum Generieren von Controllern: https://github.com/plataformatec/devise/wiki/Tool:-Generate-and-customize-controllers

Also ... jedenfalls ... habe ich es geschafft, das zu bekommen, was "AnApprentice" wollte, indem ich dies schrieb (für eine sauberere Lösung siehe die folgende große Bearbeitung):

#/my_project/app/helpers/devise_helper.rb
module DeviseHelper
   def devise_error_messages!
      return "" if resource.errors.empty?

      return resource.errors
   end
end

Und meiner Meinung nach haben die nächsten Zeilen ziemlich gut funktioniert:

<% devise_error_messages!.each do |key, value| %>
    <div class="flash <%= key %>"><%= key %> <%= value %></div>
<% end %>

Nun ... dann können Sie auf Fehler für ein bestimmtes Attribut wie dieses zugreifen:

    #Imagine you want only the first error to show up for the login attribute:
    <%= devise_error_messages![:login].first %> 

Und ... Ein kleiner Trick, bei dem nur ein Fehler (der erste, der abgefangen wird) pro Attribut angezeigt wird:

<% if resource.errors.any? %>
  <% saved_key = "" %>
  <% devise_error_messages!.each do |key, value| %>
    <% if key != saved_key %>
        <div class="flash <%= key %>"><%= key %> <%= value %></div>
    <% end %>
    <% saved_key = key %>
  <% end %>
<% end %>

Ich weiß, dass es eine Weile her ist, seit diese Frage gestellt wurde, aber ich denke, dass sie vielen Entwicklern helfen wird :).

Big Edit:

Da ich es liebe, meinen Code zu erweitern, ihn sauberer zu machen und mit anderen zu teilen, wollte ich kürzlich die devise_error_messages ändern! Methode, um es in meinen Ansichten zu verwenden und den oben erläuterten Trick anzuzeigen.

Also, hier ist meine Methode:

 def devise_error_messages! 
    html = ""

    return html if resource.errors.empty?

    errors_number = 0 

    html << "<ul class=\"#{resource_name}_errors_list\">"

    saved_key = ""
    resource.errors.each do |key, value|
      if key != saved_key
        html << "<li class=\"#{key} error\"> This #{key} #{value} </li>"
        errors_number += 1
      end
      saved_key = key
    end

    unsolved_errors = pluralize(errors_number, "unsolved error")
    html = "<h2 class=\"#{resource_name}_errors_title\"> You have #{unsolved_errors} </h2>" + html
    html << "</ul>"

    return html.html_safe
 end

Keine große Sache hier, ich habe den Code, den ich aus meiner Sicht geschrieben habe, wiederverwendet, um nur ein Fehler-Pey-Attribut anzuzeigen, da oft das erste das einzig relevante ist (wie wenn der Benutzer ein erforderliches Feld vergisst).

Ich zähle diese "eindeutigen" Fehler und erstelle mit pluralize einen H2-HTML-Titel und setze ihn VOR die Fehlerliste.

Jetzt kann ich die "devise_error_messages!" als Standard und es rendert genau das, was ich bereits zuvor gerendert habe.

Wenn Sie in Ihrer Ansicht auf eine bestimmte Fehlermeldung zugreifen möchten, empfehle ich jetzt, direkt "resource.errors [: attribute] .first" oder was auch immer zu verwenden.

Seya, Kulgar.


6

Ich verwende Devise in Rails 3 und Ihr Flash-Code ist ziemlich identisch mit dem, was ich habe. In meiner App funktioniert der Code wie erwartet. dh Gerätefehlermeldungen werden mit den restlichen Flash-Meldungen ausgegeben:

<% flash.each do |name, msg| %>
  <%= content_tag :div, msg, :id => "flash_#{name}" if msg.is_a?(String) %>
<% end %>

Probieren Sie genau diesen Code aus und prüfen Sie, ob er einen Unterschied macht - das unterschiedliche ID-Attribut kann hilfreich sein.


danke, aber das zeigt am Ende nichts. "<% = devise_error_messages!%>" gibt einen Fehler aus. das obige hat nichts getan? Ideen?
AnApprentice

Entschuldigung - Ich habe gerade erst Ihren Kommentar gesehen. Um ehrlich zu sein, gehen mir die Ideen aus. Ich gehe davon aus, dass Sie die Quelle in Ihrem Browser angezeigt und den generierten HTML-Code überprüft haben. Nur für den Fall, dass etwas von CSS versteckt wird. Verwenden Sie die neueste Version von Devise 1.1.3?
Scott

5

Ich bin darauf gekommen und es funktioniert soweit. Dadurch werden dem Flash Gerätemeldungen hinzugefügt, sodass er wie gewohnt verwendet werden kann. Bitte beachten Sie, dass ich neu bei Ruby and Rails bin ...

class ApplicationController < ActionController::Base
  after_filter :set_devise_flash_messages, :if => :devise_controller?
  ...

  private:

  def set_devise_flash_messages
    if resource.errors.any?
      flash[:error] = flash[:error].to_a.concat resource.errors.full_messages
      flash[:error].uniq!
    end
  end
end

Bearbeiten:

Tut mir leid, dass ich Wache gehalten habe und ein unerwünschtes Verhalten vorhanden war. Da after_filterwird nach dem Rendern aufgerufen, so dass es nicht wie erwartet funktioniert. Wenn jemand weiß, wie man eine Methode nach der Aktion, aber vor dem Rendern aufruft ...

Aber Sie können stattdessen so etwas verwenden:

module ApplicationHelper

  # merge the devise messages with the normal flash messages
  def devise_flash
    if controller.devise_controller? && resource.errors.any?
      flash.now[:error] = flash[:error].to_a.concat resource.errors.full_messages
      flash.now[:error].uniq!
    end
  end

end

Im views/shared/_messages.html.erb

<% devise_flash %>
<!-- then display your flash messages as before -->

1
+1 Tolle Antwort. Ich denke, dass dies definitiv die sauberste Lösung ist und gut in meine aktuelle Architektur passt. Die Antwort ist jedoch nicht so klar - im Grunde sollte alles vor der Bearbeitung ignoriert werden (und durch imo entfernt oder durchgestrichen werden).
Zelanix

3

Wenn Sie mehr als einen Blitz eines bestimmten Typs anzeigen möchten (: alert ,: note, etc ...) und nicht Ihre Zeit damit verschwenden möchten, das Verhalten eines Edelsteins zu ändern, ist dies die Lösung, die ich mit Devise verwendet habe. Ich bin mir ziemlich sicher, dass es mit jedem Edelstein verwendet werden kann, der Flash-Nachrichten verwendet.

Fügen Sie als Erstes in Ihrer application_controller.rb Folgendes hinzu:

  # Adds the posibility to have more than one flash of a given type
  def flash_message(type, text)
    flash[type] ||= []
    flash[type] << text
  end

Zweitens müssen Sie Ihre Flash-Nachrichten damit in application.html.erb anzeigen (oder wo immer Sie möchten):

   <div class="flashes">
      <% flash.each do |key, messages| %>
        <% messages = Array(messages) unless messages.is_a?(Array) %>
        <% messages.each do |message| %>
        <div class="alert alert-<%= key %>">
          <%= message %>
        </div>
        <% end %>
      <% end %>
    </div>

Als drittes sollten Sie Folgendes tun, wenn Sie in einem Controller eine Flash-Nachricht hinzufügen möchten:

flash_message(:success, "The user XYZ has been created successfully.")

Aber wie man die Devise-Nachrichten dazu bringt, flash_messages aufzurufen, anstatt ein Fehlerobjekt zu behalten.
Christopher Oezbek

3

Erstellen Sie DeviseHelper:

module DeviseHelper
  def devise_error_messages!
    return "" if resource.errors.empty?

    messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg)}.join
    return flash.now[:alert] = messages.html_safe
  end
end

Aus Ihrer Sicht ersetzen

<%= devise_error_messages! %>

Zu:

<% devise_error_messages! %>

1
Eigentlich sollten Sie verwenden: flash.now [: alert]
BM

2

Zugegeben, ein bisschen hackig, aber ich benutze diesen Helfer (app / helpers / devise_helper.rb), um Blitze zu greifen und diese zu verwenden, wenn sie auf Standard gesetzt sind resource.errors. Dies basiert nur auf dem Helfer, der in der Entwicklungsbibliothek enthalten ist.

module DeviseHelper

  def devise_error_messages!
    flash_alerts = []
    error_key = 'errors.messages.not_saved'

    if !flash.empty?
      flash_alerts.push(flash[:error]) if flash[:error]
      flash_alerts.push(flash[:alert]) if flash[:alert]
      flash_alerts.push(flash[:notice]) if flash[:notice]
      error_key = 'devise.failure.invalid'
    end

    return "" if resource.errors.empty? && flash_alerts.empty?
    errors = resource.errors.empty? ? flash_alerts : resource.errors.full_messages

    messages = errors.map { |msg| content_tag(:li, msg) }.join
    sentence = I18n.t(error_key, :count    => errors.count,
                                 :resource => resource.class.model_name.human.downcase)

    html = <<-HTML
    <div id="error_explanation">
      <h2>#{sentence}</h2>
      <ul>#{messages}</ul>
    </div>
    HTML

    html.html_safe
  end

end

2

Wenn Sie devise_error_messages huckepack nehmen möchten, können Sie dies tun, indem Sie resource.errors hinzufügen

Wenn Sie den Registrierungscontroller außer Kraft setzen, könnte dies so aussehen

def create
  if validation_or_other_check_passes
    super
  else
    build_resource
    clean_up_passwords(resource)
    resource.errors.add(:notice, "The check failed.")
    render :new 

2

Sehr einfache Möglichkeit, Fehlermeldungen für jedes Feld anzuzeigen

<%= resource.errors.messages[:email].join(" ") %>

Setzen Sie für jedes Feld den Feldnamen in eckige Klammern unter jede Zeile, in der Sie eine Inline-Fehlermeldung anzeigen möchten.


1

Anzeigen Ihres Gerätefehlers von Ihrem Controller, wobei nur der erste Fehler angezeigt wird.

flash[:error] = @resource.errors.full_messages.first

1

Nur um Eric Hu Antwort oben hinzuzufügen, wo alle If-Anweisungen verwendet werden, machen Sie stattdessen lieber so etwas.

# Controller
flash.now[:error] = flash[:error].to_a.concat(resource.errors.full_messages)

# View
<% flash.each do |name, msg| %>
 <% Array(msg).uniq.each do |message| %>
  <%= message %>
 <% end %>
<% end %>

1

Ich mache das einfach, habe für mich gearbeitet: In App / Helpers / erstelle ich eine Datei devise_helper.rb

  module DeviseHelper

  def devise_error_messages_for(resource)
    return "" if resource.errors.empty?

    messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
    sentence = I18n.t("errors.messages.not_saved",
                      count: resource.errors.count,
                      resource: resource.class.model_name.human.downcase)

    html = <<-HTML
    <div id="error_explanation">
      <h2>#{sentence}</h2>
      <ul>#{messages}</ul>
    </div>
    HTML

    html.html_safe
  end
end

In allen Ansichtsdateien ändere ich

<%= devise_error_messages! %>

zum:

<%= devise_error_messages_for(#your object in your formular)%>

für mich macht es in meiner ansicht bearbeiten und neuer benutzer:

  <%=form_for resource, as: @user, url: user_path(@user),...
      <%= devise_error_messages_for(@user) %>

hoffe es wird dir helfen;)


Ich verstehe wirklich nicht, wie das etwas macht? das ist Standardverhalten? Es ist nur eine andere Art, das zu tun <%= devise_error_messages! %>und beantwortet die Frage nicht. In der Frage wird gefragt, wie Flash auf jede Nachricht angewendet werden soll.
Mark

0
  1. Entfernen Sie die "devise_error_messages!" aus der Vorlage "app / views / users / passwords / new".
  2. Erstellen Sie einen benutzerdefinierten Controller für Ihren Benutzer (app / controller / users / passwords_controller.rb) und fügen Sie in einem After-Filter-Flash-Array Fehler hinzu:
class Users::PasswordsController < Devise::PasswordsController
  after_filter :flash_errors

  def flash_errors
    unless resource.errors.empty?
      flash[:error] = resource.errors.full_messages.join(", ")
    end
  end
end

0

Ich mache es gerne so, wie es im anderen Devise-Controller mit diesem Cheat gemacht wird.

<% if flash.count > 0 %>
  <div id="error_explanation">
    <h2>Errors prevented you from logging in</h2>
      <ul>
        <% flash.each do |name, msg| %>
        <li>
          <%= content_tag :div, msg, id: "flash_#{name}" %>
        </li>
       <% end %>
     </ul>
   </div>
<% end %>

0

Damit materialisecss Fehlermeldungen als Toast anzeigt, habe ich diesen Code in app / helpers / devise_helper.rb hinzugefügt

module DeviseHelper
  def devise_error_messages!

    messages = resource.errors.full_messages.map { |msg|
      String.new(" M.toast({html: '" + msg + "' }); ".html_safe )
    }.join

    messages = ("<script>" + messages + "</script>").html_safe
  end 
end

Ich bin sicher, es wäre die sauberste Art, es zu schreiben, aber es wacht perfekt auf


0

DeviseHelper#devise_error_messages! ist veraltet und wird in der nächsten Hauptversion entfernt.

Devise verwendet jetzt ein Teil-Unter devise/shared/error_messages, um standardmäßig Fehlermeldungen anzuzeigen und deren Anpassung zu vereinfachen. Aktualisieren Sie Ihre Ansichten, indem Sie Anrufe ändern von:

      <%= devise_error_messages! %>

zu:

      <%= render "devise/shared/error_messages", resource: resource %>

-1

Ich habe gerade ein app/helpers/devise_helper.rbLike John erstellt, aber die Methode so überschrieben:

module DeviseHelper
  def devise_error_messages!
    flash[:error] = resource.errors.full_messages.join('<br />')
    return ''
  end
end

Damit muss ich nichts anderes ändern. Ist es eine schlechte Idee? Ich bin neu in Schienen, zögern Sie nicht, mich zu korrigieren. Vielen Dank.


Dies funktioniert nicht wie gewünscht. Die Flash-Nachricht enthält jetzt das HTML-Tag <br>. Normalerweise fügen Sie nur Zeichenfolgen in Ihre Flash-Nachricht ein.
AZ.

Vielleicht, aber die neue Leitung funktioniert immer noch. Schlagen Sie eine andere Lösung vor, wenn Ihnen diese nicht gefällt.
YoyoS

-2

Ich habe gerade devise_error_messages deklariert! als leerer Helfer. Und manuell abgerufen und behandelt die Fehler in einem allgemeinen Fehler teilweise für meine Anwendung. Es schien die einfachste Lösung zu sein, und ich muss nicht alle Dateien des Geräts durchgehen und den Aufruf des Fehlerbehandlers entfernen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.