7

Wenn Sie eine Bestätigungsnachricht in Büroklammer gesetzt, wieändert Fehlerprüfungsmeldung in Papierklammer

validates_attachment_presence, :image, :message => 'xxxx' 

Die benutzerdefinierte Nachricht automatisch mit dem Namen des Feldes voran kommt, auch wenn es mit der überschrieben wurde: Meldung . Wie überschreiben Sie die Nachricht vollständig und machen sie vollständig benutzerdefiniert?

Edit: Tippfehler

Antwort

7

Keine echte Lösung, aber eine einfache ist es, Büroklammer Validierung zu überspringen und benutzerdefinierte schreiben.

validate :check_content_type 

    def check_content_type 
    if !['image/jpeg', 'image/gif','image/png'].include?(self.image_content_type) 
    errors.add_to_base("Image '#{self.image_file_name}' is not a valid image type") # or errors.add 
    end 
    end 

Ich hoffe, es

0

Ich weiß nicht, ob es nur ein Tippfehler in Ihrer Frage, aber es sollte sein:

validates_attachment_presence :image, :message => 'xxxx' 

Und ich würde nicht verwenden: Nachricht eine benutzerdefinierte Fehlermeldung hinzufügen , aber lege es in eine locales-Datei.

+0

nur einen Tippfehler helfen, bearbeitet es prost – Smickie

+0

Sonderbare. Ich habe es gerade getestet und sehe die Nachricht gut. Das Problem ist, dass der Fehler zu 'image_file_name' hinzugefügt wird. Sie könnten also einfach eine einfache Rails-Validierung für diese Spalte hinzufügen (nicht sicher, ob sie funktioniert) und eine Nachricht hinzufügen.Dennoch ist es besser, alle Nachrichten in einer Gebietsschemadatei zu bearbeiten. Und welche Version von Paperclip benutzen Sie? Weil es ein Fehler in einer älteren Version sein könnte. – RobinBrouwer

+0

Lesen Sie Ihren Beitrag einfach noch einmal und ich glaube, ich habe ihn falsch interpretiert. Die Nachricht wird angezeigt, aber der Spaltenname wird auch in der Nachricht angezeigt. Ich schätze, das ist ein 'error_messages_for' Ding. Normalerweise benutze ich 'error_message_for' nicht (auch weil es nicht in Rails 3 ist), also habe ich das in meinem kleinen Test nicht gesehen. Ich weiß nicht, wie ich es für dich reparieren soll. Das tut mir leid. :( – RobinBrouwer

1

Es ist Standard-Rails-Verhalten zu zeigen den Attributnamen vor den Validierungsfehlern enthalten. Sie haben ein paar Optionen, um dieses Verhalten zu arbeiten:

  1. Machen Sie Ihre Fehlermeldung auf OK den Attributnamen vorangestellt haben :)

  2. eine andere Fehlermeldung Formatierer verwenden. Es ist ziemlich einfach, einen eigenen Helfer zu schreiben, der durch ein @ object.errors iteriert und Nachrichten in HTML-Tags einfügt. Ich bevorzuge es, die Fehlermeldungen in der Zeile in der Nähe der Felder zu verwenden, so dass wir den Attributnamen immer überspringen.

  3. Benutzerdefinierte Validierung, die die errors to base hinzufügt. Das ist einfach, aber falsch, da Sie vermuten, dass ein Validierungsfehler in einem Feld vorliegt. Kann immer noch dein Problem lösen.

  4. Überschreiben Sie humanized_attribute_name für dieses Attribut, um es zu verbergen. humanized_attribute_name wird wahrscheinlich an anderer Stelle verwendet, was zu anderen Problemen führen kann.

.

+0

Der Attributname wird zu den Fehlern hinzugefügt, um die Fehlergruppe nicht einzelne Felder zu bilden, aber der Name der Felder wird im Basisfehlerbereich angezeigt. – Smickie

3

Eigentlich möchten Sie dies in Ihrem Blick und nicht Ihr Modell tun, und es ist eigentlich ziemlich geradlinig. Wir werden nur eine Schleife durch die Fehler, und wenn die ein für Ihre Befestigung kommt werden wir die Feldnamen ignorieren:

<ul> 
    <% @myObject.errors.keys.each do |field| %> 
    <% @myObject.errors[field].each do |msg| %> 
     <% if field == :image_file_name %> 
     <li><%= msg %></li> 
     <% else %> 
     <li><%= field.to_s + " " + msg %></li> 
     <% end %> 
    <% end %> 
    <% end %> 
</ul> 

Ersetzen @myObject mit dem Namen des Modells, das nur den Nachrichtensatz angezeigt werden soll zu Ihren Anhangsvalidierungsfehlern. Dies ist nur ein einfaches Beispiel, das sie inline mit dem Rest anzeigt, aber natürlich können Sie mit den Nachrichten alles machen, was Sie möchten. Es ist wichtig, den Namen des Feldes beizubehalten, in dem der Fehler aufgetreten ist, falls Sie eine für den Fehler spezifische Logik programmieren möchten, ohne sich darauf verlassen zu müssen, dass die Fehlermeldung für immer gleich bleibt.