0

Ich bin neu in Ruby und auch Rails, und ich versuche ein verschachteltes Formular zusammenzustellen, das letztendlich eine Seite erstellt, aber auch dem Benutzer erlaubt, einzelne Teile inline zu erstellen Die Seite. Das Inline-Formular enthält zwei Schaltflächen, einer fügt ein Teil hinzu und der andere entfernt sie. Hier meine relevanten Dateien (bitte lassen Sie mich wissen, wenn Sie andere sehen müssen) sind, und ich werde die Probleme Liste Ich habe nach:Verschachteltes Formular, das Daten nicht rendert oder speichert

FYI, die Edelsteine ​​Ich verwende sind: Slim, Simple Form, cocoon und Bootstrap. Auf Schienen 4.

_form.html.slim

= simple_form_for(@page, html: { class: 'form-horizontal' }) do |f| 

    = f.input :title, label: 'Title' 
    = f.input :description, label: 'Desc' 

    .form-group 
    .col-xs-10 
     label Parts 
     .form-inline 
     = f.simple_fields_for :parts do |part| 
      = render 'part_fields', f: part 
     .links 
      = link_to_add_association 'Add Part', f, :parts 

    = f.button :submit 

_parts_fields.html.slim

= f.input :part_type, collection: ['String 1', 'String 2'], prompt: 'Part type', label: false 
= f.input :part_title, placeholder: 'Part title', label: false 
= f.input :part_desc, placeholder: 'Part description', label: false 
= link_to_remove_association 'Remove Part', f 

/models/page.rb

class Page < ActiveRecord::Base 
    belongs_to :project 
    has_many :parts 
    accepts_nested_attributes_for :parts 
end 

/models/Teil. rb

class Part < ActiveRecord::Base 
    belongs_to :page 
end 

/controllers/pages_controller.rb

class PagesController < ApplicationController 
    def index 
     @pages = Page.all 

     respond_to do |format| 
      format.html 
      format.json { render json: @pages } 
     end 
    end 

    def new 
     @page = Page.new 

     respond_to do |format| 
      format.html 
      format.json { render json: @page } 
     end 
    end 

    def edit 
     @page = Page.find(params['id']) 
    end 

    def create 
    @page = Page.new(page_params) 

     respond_to do |format| 
      if @page.save 
       format.html { redirect_to(@page) } 
       format.json { render json: @page, status: :created, location: @page } 
      else 
       format.html { render action: 'new' } 
       format.json { render json: @page.errors, status: :unprocessable_entity } 
      end 
     end 
    end 

    def update 
    @page = Page.find(params['id']) 

     respond_to do |format| 
      if @page.update_attributes(page_params) 
       format.html { redirect_to(action: 'index') } 
       format.json { head :ok } 
      else 
       format.html { render action: 'edit' } 
       format.json { render json: @page.errors, status: :unprocessable_entity } 
      end 
     end 
    end 

    def page_params 
     params.require(:page).permit(:title, :description, parts_attributes: [:id, :part_type, :part_title, :part_desc]) 
    end 
end # End Pages Controller 

Routen

resources :projects do 
    resources :pages 
end 

resources :pages 

resources :parts 

Probleme:

1) Das Formular wird alle Daten (nicht bearbeiten/aktualisieren aktuellen Seiten nicht Spar oder neue erstellen). Update: behoben, siehe meine Antwort unten.

2) Auf der partiellen verwende ich eine collection, um ein Dropdown-Menü zu haben, aber diese Testwerte sind jetzt fest codiert. Wie kann ich ein Dropdown haben, das jedes Feld mit Spalten aus der db füllt?

3) Die Inline-Formularelemente, die aus dem Partiellen stammen, werden nicht auf dem Hauptformular gerendert. Ich sehe nur das Etikett "Parts" und keine Elemente darunter. Update: @pages.parts.build löste dies.

Schätzen Sie jede Hilfe, die Sie mir geben können.

+1

In Ihrer Steuerung versuchen Sie '@ page.parts.build', um eine neue Teile-Instanz zur Teile-Sammlung hinzuzufügen. –

Antwort

0

Das Formular speichert jetzt Daten wie erwartet. In einem meiner Teile hatte ich zwei Felder, die identisch waren und somit einen stillen Konflikt für mich erzeugten. Nachdem ich das gelöst hatte, fing ich an, einen Unpermitted parameter: _destroy Fehler zu erhalten, und das Problem war, :_destroy zu der Liste der erforderlichen Parameter für parts_attributes hinzuzufügen.

1
  1. Sie haben ein @page Objekt ohne parts. Also, wenn es versucht, das fields_for zu rendern, tut es das! Nur, null mal. Fügen Sie in Ihrem Controller @page.parts.build hinzu, um einen hinzuzufügen.

  2. Nicht sicher; im Moment zu müde. Versuchen Sie, save zu save! und update_attributes zu update! zu ändern, so dass Rails einen Fehler auslöst, anstatt still zu senden. BTW, warum haben Sie if params[:page] in Ihrem page_params? Das ist nicht nötig; das ist was require(:page) tut.

  3. ActiveRecord stellt eine column_names-Methode bereit, die ein Array mit Spaltennamen zurückgibt.

+0

Danke, dass Sie Ryan kommentieren und sich für die späte Antwort entschuldigen. Ich muss die "build" -Methode lesen, um die Details dahinter genau zu verstehen, aber das hat diesen Teil meines Problems gelöst, also danke. Das Formular speichert immer noch nicht - ich benutze 'save!' Und 'update!' Jetzt, aber es werden keine Fehler protokolliert. in der Tat sehe ich die gleiche genaue Ausgabe auf dem Terminal beim Aktualisieren eines Datensatzes. Irgendwelche Ideen, was könnte es tun? – Blueshift

1

Eigentlich @page.parts.build immer ein neues part bauen, auch wenn der Benutzer dies nicht angefordert hat (es könnte sein, was Sie wollen). Jetzt zeigen Sie nur die Add Schaltfläche für jeden verschachtelten Teil an. Ich würde annehmen, dass Sie nur eine Add Taste wollen würde, wie folgt:

.form-inline 
    = f.simple_fields_for :parts do |part| 
     = render 'parts_fields', f: part 
     = link_to_add_association 'Remove Part', f, :parts    
    = link_to_add_association 'Add Part', f, :parts 

Dies wird immer zeigen die Add Part Link (und nur einmal).

Was nicht speichern, mögliche Gründe sind:

  • die Daten nicht an den Server gesendet (überprüfen Sie Ihre Log-Datei, mögliche Gründe sind Fehler in Ihrem HTML, zB mehrere identische ids)
  • die Daten indem Sie Ihre starken Parameter Befehl
  • blockiert die Daten durch den reject_if Zustand des accepts_nested_attributes_for
  • ein Fehler bei der Überprüfung
blockiert

Jetzt, wenn der angezeigte Code ist Ihr tatsächlicher Code alles scheint in Ordnung. Könnten Sie uns also zeigen, was auf dem Server veröffentlicht wurde? (Überprüfen Sie Ihre Logdatei).

+0

Nathan, danke, dass du dir die Zeit genommen hast, die Hand zu reichen! Ich habe gerade herausgefunden, warum das Formular nicht gespeichert wurde (ich werde einen Beitrag darüber machen). Ich habe das Formular + teilweise im OP aktualisiert; Die Idee ist, dass der Benutzer nur ein Add-Part im gesamten Formular hat und einen Remove Part neben jedem hinzugefügten Part. Hier ist ein Bild. Frage: Ein Teil wird immer standardmäßig erstellt, wie kann ich das ändern, also muss der Benutzer sogar den ersten Teil hinzufügen? – Blueshift

Verwandte Themen