Sono un novellino che mi inciampa creando la mia prima applicazione per rotaie. Sto cercando di aggiungere più record a una tabella da un modulo annidato e al momento viene aggiunto solo l'ultimo record.Aggiunta di più record in Rails
Sto lavorando su un modulo che consentirà a un utente di associare un'equazione matematica con come dovrebbe essere letto sotto una determinata regola di lettura. In una visione astratta, due record semplici sarebbero:
equation: "x-3", readingRule:"Simple", transcription"x take away three"
equation: "x-3", readingRule:"Standard", transcription"x minus three"
Ho quattro tabelle: 'Equazioni', 'trascrizioni', 'readingRuleSets', e 'test'. Un singolo test consiste degli id di un'equazione, una trascrizione e un readRuleSet.
Ho un modulo, che ha un campo di testo per l'utente per selezionare l'id dell'equazione, e quattro campi di testo (associati ai miei quattro set di regole di lettura) per loro per selezionare l'id delle trascrizioni. Quando premo invio, voglio aggiungere quattro nuovi "test", uno per ciascuna delle trascrizioni. Al momento, Rails aggiunge solo l'ultimo.
Ho pensato che fosse perché l'id dei campi di testo sono gli stessi nella sorgente html. Ho provato a concatenare il nome del campo con l'indice da each_with_index, ma questo mi ha lasciato con un record aggiunto a 'test', e il reading_rule_set_id era nullo perché avevo modificato il nome della colonna con l'indice. Così l'ho tolto, letto molto di più, guardato i railscast 196 e sono ancora bloccato.
bit rilevanti di codice:
\ app \ modelli \ test.rb
class Test < ActiveRecord::Base
has_many :equations
has_many :reading_rule_sets
has_many :transcriptions
accepts_nested_attributes_for :equations :transcriptions :reading_rule_sets
end
Le altre tre tavoli hanno i loro rispettivi 'belongs_to di.
\ app \ Visto \ test:
<div>
<fieldset>
<legend> Reading Rules and Transcriptions </legend>
<% ReadingRuleSet.all.each_with_index do |rrs, index| %>
<div class="row">
<div class="col-md-6">
<label><%= rrs.name %></label>
</div>
<div class="col-md-6">
<%= f.text_field :transcription_id %>
<%= f.hidden_field :reading_rule_set_id, :value =>rrs.id %>
<!--# .to_s + index.to_s-->
</div>
</div>
<% end %>
</fieldset>
</div>
<div class="actions">
<%= f.submit %>
</div>
app \ controllori \ tests_controller.rb
# POST /tests
# POST /tests.json
def create
@test = Test.new(test_params)
respond_to do |format|
if @test.save
format.html { redirect_to @test, notice: 'Test was successfully created.' }
format.json { render :show, status: :created, location: @test }
else
format.html { render :new }
format.json { render json: @test.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /tests/1
# PATCH/PUT /tests/1.json
def update
respond_to do |format|
if @test.update(test_params)
format.html { redirect_to @test, notice: 'Test was successfully updated.' }
format.json { render :show, status: :ok, location: @test }
else
format.html { render :edit }
format.json { render json: @test.errors, status: :unprocessable_entity }
end
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_test
@test = Test.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def test_params
params.require(:test).permit(:equation_id, :reading_rule_set_id, :transcription_id, :transcription_transcription)
end