/ / Rails: ako odoslať viac formulárov do jednej tabuľky - rubín-on-rails, rubín, formuláre, rubín-on-rails-3

Koľajnice: ako predkladať viacero foriem rovnaké tabuľky - ruby on rails, ruby, formulároch, ruby on rails 3

Momentálne budujem nástroj na prácu.Zahŕňa to odovzdanie viacerých časov začiatku a konca úlohy každý deň. Existuje niekoľko pracovných miest a každá z nich má každý deň nový čas spustenia. Pre urýchlenie procesu chcem odoslať všetky prevádzkové časy v jednej forme. Momentálne sa zobrazujú všetky tieto formuláre, ale keď zadám, prejde iba jeden. Čo mi chýba?

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>

odpovede:

0 pre odpoveď č. 1

Ignorujte komentáre o Ajaxe, fields_for urobí, čo chceš, a ajax je pre toto komplexná divoká husacia honička. Musíte len presunúť značku formulára na vonkajšiu stranu slučky.

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

by sa malo zmeniť na

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

A odstráňte form_for vnútri _form.html.erb. Potom budete musieť vytvoriť novú akciu radiča, ktorá dokáže spracovať viac parametrov @runtime naraz, napríklad #update_batch.

To nie sú všetky detaily, ale to je myšlienka. To, čo sa chcete stať, je jeden formulár, ktorý má parametre všetko naraz.