AJAX-Formular (unter Verwendung von simple_form) mit beibehaltener Fehlerüberprüfung

Dies mag eine der schwierigeren Fragen sein, die ich gestellt habe, aber ich stecke seit einigen Tagen fest und dachte, es wäre am besten, Unterstützung von der erfahreneren Rails-Community zu erhalten.

Ich arbeite an einer Dummy-App, die dieser Anleitung ungefähr folgt ...Ajax / JQuery-Tutorial...

Der Leitfaden hat mir beim Erstellen eines Übermittlungsformulars für Marken (einschließlich verschachtelter Modelle, "Modell", "Untermodell" und "Stil") (mithilfe von simple_form) und eines Markenverzeichnisses auf derselben Seite geholfen. Dies funktioniert einwandfrei , und die Validierung (für meine Modelle) wird erzwungen. Wenn ich jedoch das Formular und die Markenauflistung auf dieselbe Seite bringe, gehen die ordentlichen Inline-Validierungsfehler verloren, die bei fehlgeschlagener Übermittlung aufgetreten sind (siehe Abbildung unten). Wenn ich nicht in der Lage bin, die Inline-Fehler zum Laufen zu bringen, habe ich festgestellt, dass ich mehr über das Rendern lernen muss. Deshalb bin ich fest entschlossen, die Antwort auf diese Frage zu finden

... und hier ist die Auflistung:

Unten ist der Controller für die Indexaktion:

<code>  def index

    #This is for the product listing

    @brands = Brand.all.reverse 

    #This is for the form   

    @brand = Brand.new
    @model = Model.new
    @submodel = Submodel.new
    @style = Style.new

    respond_to do |format|
      format.html
    end
  end
</code>

Das obige Formular erstellt die Marke, das Modell, das Untermodell und den Stil für die Verwendung im verschachtelten Übermittlungsformular ... Der Code für das Formular lautet wie folgt:

<code><%= simple_form_for @brand, :html => { :class => 'form-horizontal' }, :remote => true do |m| %>

  <fieldset style = "margin-top:34px;">
    <legend></legend>
    <%= m.input :name, :label => 'Brand' %>         
    <%= m.simple_fields_for :models, @model do |p| %>    
      <%= p.input :name, :label => 'Model' %>
      <%= p.simple_fields_for :submodels, @submodel do |s| %>
        <%= s.input :name, :label => 'Submodel' %>
        <%= s.simple_fields_for :styles, @style do |ss| %>
          <%= ss.input :name, :label => 'Style' %>
        <% end %>
      <% end %>
    <% end %>

    <div class="form-actions">
      <%= m.submit nil, :class => 'btn btn-primary' %>
      <%= link_to 'Cancel', brands_path, :class => 'btn' %>
    </div>
  </fieldset>
<% end %>
</code>

Jetzt, wie Sie sehen können, benutze ich:remote => true ... Ich möchte, dass das Formular entweder die neue "Marke" erstellt oder mit Inline-Validierungsfehlern neu geladen wird. Im Moment sieht meine Erstellungsaktion so aus:

<code>def create
    @brand = Brand.new(params[:brand])

    respond_to do |format|
      if @brand.save
        format.html { redirect_to brands_url, notice: 'Brand was successfully created.' }
        format.json { render json: @brand, status: :created, location: @brand }
        format.js
      else
        format.html { render action: "index" }
        format.json { render json: @brand.errors, status: :unprocessable_entity }
        format.js { render 'reload' }
      end
    end
  end
</code>

Der Code, der unter angezeigt wirdif @brand.save scheint zu funktionieren .. aber der Code unter "else" funktioniert nicht so wie ich es gerne hätte. Was passiert also, wenn @brand NICHT speichert? Ich glaube, dass der Code innerhalb der Indexaktion ausgeführt wird, dann @ brand.errors in json konvertiert wird (was ich für die simple_form-Validierungsfehler annehme) und dann reload.js.erb ausgeführt wird.

Bei dem Versuch, das Formular neu zu laden (mit Überprüfungsfehlern), habe ich die Zeile eingefügt$("#entryform").load(location.href+" #entryform>*",""); in reload.js.erb ... Wenn ich ungültige Daten in mein Formular einfüge, wird reload.js.erb aufgerufen, aber alles, was passiert, ist, dass die Formularfelder neu geladen werden, anstatt dass die Daten eingegeben werden und Inline-Validierungsfehler auftreten.

Ich hoffe, ich habe hier genug Informationen zur Verfügung gestellt, um Hilfe zu bekommen. Vielen Dank!

Antworten auf die Frage(3)

Ihre Antwort auf die Frage