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.
In Ihrer Steuerung versuchen Sie '@ page.parts.build', um eine neue Teile-Instanz zur Teile-Sammlung hinzuzufügen. –