/ / Rails: So senden Sie mehrere Formulare an dieselbe Tabelle - Ruby-on-Rails, Ruby, Formulare, Ruby-on-Rails-3

Rails: Wie man mehrere Formulare an einen Tisch schickt - Ruby-on-Rails, Ruby, Formulare, Ruby-on-Rails-3

Ich baue gerade ein Werkzeug für die Arbeit. Dabei werden täglich mehrere Start- und Endzeiten für Jobs übermittelt. Es gibt mehrere Jobs und jeder hat jeden Tag eine neue Laufzeit. Um den Prozess zu beschleunigen, möchte ich alle Laufzeiten in einem Formular einreichen. Derzeit werden alle Formulare angezeigt, aber wenn ich sie einreiche, wird nur eine Einreichung durchgeführt. Was vermisse ich?

runtime.rb

class Runtime < ApplicationRecord
belongs_to :Mrpjob
accepts_nested_attributes_for :Mrpjob
end

runtimes_controller.rb

class RuntimesController < ApplicationController
before_action :set_runtime, only: [:show, :edit, :update, :destroy]

# GET /runtimes
# GET /runtimes.json
def index
@runtimes = Runtime.all
@sorting = @runtimes.order("date asc")
end

# GET /runtimes/1
# GET /runtimes/1.json
def show
end

# GET /runtimes/new
def new
@runtime = Runtime.new
@mrpjobs = Mrpjob.all
@runtimes = Array.new(Mrpjob.count)
end

# GET /runtimes/1/edit
def edit
@mrpjobs = Mrpjob.all
end

# POST /runtimes
# POST /runtimes.json
def create
@runtime = Runtime.new(runtime_params)


respond_to do |format|
if @runtime.save
format.html { redirect_to @runtime, notice: "Runtime was successfully created." }
format.json { render :show, status: :created, location: @runtime }
else
format.html { render :new }
format.json { render json: @runtime.errors, status: :unprocessable_entity }
end
end
end

# PATCH/PUT /runtimes/1
# PATCH/PUT /runtimes/1.json
def update
respond_to do |format|
if @runtime.update(runtime_params)
format.html { redirect_to @runtime, notice: "Runtime was successfully updated." }
format.json { render :show, status: :ok, location: @runtime }
else
format.html { render :edit }
format.json { render json: @runtime.errors, status: :unprocessable_entity }
end
end
end

# DELETE /runtimes/1
# DELETE /runtimes/1.json
def destroy
@runtime.destroy
respond_to do |format|
format.html { redirect_to runtimes_url, notice: "Runtime was successfully destroyed." }
format.json { head :no_content }
end
end

private
# Use callbacks to share common setup or constraints between actions.
def set_runtime
@runtime = Runtime.find(params[:id])
end

# Never trust parameters from the scary internet, only allow the white list through.
def runtime_params
params.require(:runtime).permit(:start_time, :end_time, :date, :Mrpjob_id)
end
end

_form.html.erb

<%= form_for @runtime, :html => { :class => "form-horizontal runtime" } do |f| %>

<% if @runtime.errors.any? %>
<div id="error_expl" class="panel panel-danger">
<div class="panel-heading">
<h3 class="panel-title"><%= pluralize(@runtime.errors.count, "error") %> prohibited this runtime from being saved:</h3>
</div>
<div class="panel-body">
<ul>
<% @runtime.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
</div>
<% end %>
<div class="col-sm-6 padding">

<div class="form-group">
<%= f.label :start_time, :class => "control-label col-lg-2" %>
<div class="col-lg-6">
<%= f.text_field :start_time, :class => "form-control" %>
</div>
<%=f.error_span(:start_time) %>
</div>
<div class="form-group">
<%= f.label :end_time, :class => "control-label col-lg-2" %>
<div class="col-lg-6">
<%= f.text_field :end_time, :class => "form-control" %>
</div>
<%=f.error_span(:end_time) %>
</div>
<div class="form-group">
<%= f.label :date, :class => "control-label col-lg-2" %>
<div class="col-lg-6">
<%= f.text_field :date, :class => "form-control" %>
</div>
<%=f.error_span(:date) %>
</div>

<div class="row">
<% @mrpjobs.each do |p| %>
<div class="col-sm-2 text-center">
<%= f.radio_button :Mrpjob_id, p.id %>
<%= f.label :Mrpjob_id, p.name %>
</div>
<% end %>
</div>

<div class="form-group">
<div class="col-lg-offset-2 col-lg-10">
<%= f.submit nil, :class => "btn btn-primary" %>
<%= link_to t(".cancel", :default => t("helpers.links.cancel")),
runtimes_path, :class => "btn btn-default" %>
</div>
</div>
</div>

<% end %>

new.html.erb

<%- model_class = Runtime -%>
<div class="page-header">
<h1><%=t ".title", :default => [:"helpers.titles.new", "New %{model}"], :model => model_class.model_name.human.titleize %></h1>
</div>

<div class="container">
<div class="row">

<% @runtimes.each do |runtime| %>
<%= fields_for @runtime do |r| %>
<%= render "form" %>
<% end %>
<% end %>
</div>
</div>

Antworten:

0 für die Antwort № 1

Ignoriere die Kommentare zu Ajax. fields_for wird tun, was Sie wollen und Ajax dafür ist eine wilde Gänsejagd in der Komplexität. Sie müssen nur das Formular-Tag an die Außenseite der Schleife verschieben.

    <% @runtimes.each do |runtime| %>
<%= fields_for @runtime do |r| %>
<%= render "form" %>
<% end %>
<% end %>

sollte sich ändern zu sein

    <% @runtimes.each do |runtime| %>
<%= form_tag %>
<%= fields_for @runtime do |r| %>
<%= render "form" %>
<% end %>
<% end %>
<% end %>

Und entferne das form_for Innerhalb _form.html.erb. Dann müssen Sie eine neue Controller-Aktion erstellen, die mehrere @ runime-Parameter gleichzeitig verarbeiten kann, z. B. #update_batch.

Das ist nicht das ganze Detail, aber das ist die Idee. Was Sie tun möchten, ist ein Formularbeitrag, der die Parameter für enthält alle der Laufzeiten auf einmal.