0

Ich habe ein Formular, um ein Produkt zu erstellen. Ein Produkt hat viele Felder mit Validierungen. Zum Beispiel:Rails Validierungsfehler pro Formularfeld

  • Name:
  • Beschreibung:
  • Farben:
  • Größe:
  • Verfügbare Mengen:

Say Benutzer versucht, leere Form zu speichern. Jetzt möchte ich zeigen, haben folgende Art von Fehler hash:

{ 
    general: 'Something went wrong, Please contact support team.' 
    product: { 
    name: 'Name can not be blank', 
    description: 'Description can not be blank' 
    } 
} 

Damit ich general Fehler oben zeigen kann (falls vorhanden) oder ich in der Lage, Fehler zu zeigen, gerade über dem entsprechenden Feld.

In products_controller,

def create 
    @product = Product.new(product_params) # Strong params 
    if @product.save 
     flash[:success] = "Welcome to the Sample App!" 
     redirect_to @product 
    else 
     render 'new' 
    end 
    end 

Wie kann ich Fehler zu jedem Feld entspricht? Ich bin mir bewusst, die @product.errors wird mir Fehler geben. Aber ich möchte auch einen general Fehlerschlüssel behalten. flash sind eine Möglichkeit, es zu tun. Aber soweit ich weiß, können wir im Nu nur Textnachrichten senden. Was sollte der richtige Weg dazu in Rails sein?

Danke,

Antwort

1

Hier ist meine Lösung für dieses Problem. Ich habe eine einfache Hilfsmethode erstellt, die ich in der Ansicht pro Feld verwende. Es ist auch ziemlich erweiterbar, also fühle dich nicht eingeschränkt durch seinen aktuellen Zustand. Es kann leicht zusätzliche Argumente/Optionen akzeptieren können benutzerdefinierte CSS-Klassen, etc. hinzufügen

# app/helpers/form_errors_helper.rb 
module FormErrorsHelper 
    def error_message_on(object, method) 
    return unless object.respond_to?(:errors) && object.errors.include?(method) 
    errors = field_errors(object, method).join(', ') 

    content_tag(:div, errors, class: 'form-group-error') 
    end 

    private 

    def field_errors(object, method) 
    object.errors[method] 
    end 
end 

# css 
.form-group-error { 
    # your styling here 
} 

# form 
<%= form_for(@product) do |f| %> 
    <div class="form-group"> 
    <%= f.label(:name) %> 
    <%= f.text_field(:name) %> 
    <%= error_message_on(f.object, :name) %> 
    </div> 

    <div class="form-group"> 
    <%= f.label(:description) %> 
    <%= f.text_area(:description) %> 
    <%= error_message_on(f.object, :description) %> 
    </div> 
<% end %> 

Damit Sie einen anderen Schlüssel hinzufügen können, general auf die Nachrichten-Hash.

Nehmen wir an, Sie tun das in Ihrem Modell.

Dann verwenden Sie aus Ihrer Sicht den gleichen Helfer.

error_message_on(f.object, :general) 

Wenn Sie verschiedene Styling für den „allgemeinen“ Fehler, dann können Sie in weiteren Argumenten zu diesem Helfer, wie zusätzliche CSS-Klassen übergeben.

+0

Sinn macht. Vielen Dank. – Indyarocks

+0

du bist willkommen @Indyarocks. Prost. –

0

einfach können Sie <%=f.error_span(:name) %> in Ihrer html.erb Datei verwenden

Beispiel:

<div class="form-group"> 
    <%= f.label(:name) %> 
    <%= f.text_field(:name) %> 
    <%=f.error_span(:name) %> 
</div> 

Hinweis: Sie benötigen twittern-Bootstrap-Schienen Juwel für diese zu arbeiten, und es wird Validierungen leicht machen, für alle Seiten. Lass mich wissen, wenn du das brauchst !!

+0

Sie tun ziemlich genau das, was ich geantwortet habe ... haha ​​https://github.com/seyhunak/twitter-bootstrap-rails/blob/c6893c3db02108bcdee7f8f333531b99806779ac/app/helpers/form_errors_helper.rb –