Ich versuche, Ryan Bates RailsCast #196: Nested model form part 1 zu folgen. Es gibt zwei offensichtliche Unterschiede zur Ryans-Version: 1) Ich verwende ein eingebautes Gerüst und nicht raffiniert, wie er es benutzt, und 2) Ich leite Schienen 4 (Ich weiß nicht, welche Version Ryans in seiner Besetzung verwendet , aber es ist nicht 4).RoR geschachtelte Attribute erzeugt Duplikate beim Bearbeiten
Also hier ist, was ich tat
rails new survey2
cd survey2
bundle install
rails generate scaffold survey name:string
rake db:migrate
rails generate model question survey_id:integer content:text
rake db:migrate
Dann habe ich die Assoziationen zu den Modellen wie so
class Question < ActiveRecord::Base
belongs_to :survey
end
und so
class Survey < ActiveRecord::Base
has_many :questions
accepts_nested_attributes_for :questions
end
Dann habe ich die verschachtelte Ansicht Teil
<%= form_for(@survey) do |f| %>
<!-- Standard rails 4 view stuff -->
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.fields_for :questions do |builder| %>
<div>
<%= builder.label :content, "Question" %><br/>
<%= builder.text_area :content, :rows => 3 %>
</div>
<% end %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
und schließlich die Steuerung so, dass drei Fragen erstellt werden, wenn eine neue Umfrage
class SurveysController < ApplicationController
before_action :set_survey, only: [:show, :edit, :update, :destroy]
# Standard rails 4 index and show
# GET /surveys/new
def new
@survey = Survey.new
3.times { @survey.questions.build }
Rails.logger.debug("New method executed")
end
# GET /surveys/1/edit
def edit
end
# Standard rails 4 create
# PATCH/PUT /surveys/1
# PATCH/PUT /surveys/1.json
def update
respond_to do |format|
if @survey.update(survey_params)
format.html { redirect_to @survey, notice: 'Survey was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @survey.errors, status: :unprocessable_entity }
end
end
end
# Standard rails 4 destroy
private
# Use callbacks to share common setup or constraints between actions.
def set_survey
@survey = Survey.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def survey_params
params.require(:survey).permit(:name, questions_attributes: [:content])
end
end
So instanziert wird, eine neue Umfrage mit drei Fragen zu schaffen ist in Ordnung. Wenn ich jedoch versuche, eine der Umfragen zu bearbeiten, werden die ursprünglichen drei Fragen beibehalten, während drei weitere erstellt werden. Anstatt also drei Fragen, die für die bearbeitete Umfrage, ich habe jetzt 6. Ich
Rails.logger.debug("New method executed")
das neue Verfahren in der Steuerung hinzugefügt, und soweit ich das beurteilen kann, ist es nicht ausgeführt wird, wenn ich tue eine Bearbeitungsoperation Kann mir jemand sagen, was ich falsch mache?
Jede Hilfe wird sehr geschätzt!
können Sie den Bearbeitungs hinzufügen und Aktionen zu Ihrem Controller-Code aktualisieren, so dass wir für die Fehler überprüfen kann? – Almaron
Sicher Sache! Ich nehme an, etwas ist auf dem Altar der Kürze verloren gegangen. – conciliator