Rails 4 geschachtelte Attribute nicht speichern
Ich kann nicht scheinen, um verschachtelte Attribute in der Datenbank speichern. Ich bin mit Schienen 4.
Hier sind meine Modelle :
class Answer < ActiveRecord::Base
belongs_to :question
end
class Question < ActiveRecord::Base
has_many :answers
belongs_to :survey
accepts_nested_attributes_for :answers, allow_destroy: true
end
class Survey < ActiveRecord::Base
has_many :questions
validates_presence_of :name
accepts_nested_attributes_for :questions
end
Hier ist der controller:
def create
@survey = Survey.new(survey_params)
respond_to do |format|
if @survey.save
format.html { redirect_to @survey, notice: 'Survey was successfully created.' }
format.json { render action: 'show', status: :created, location: @survey }
else
format.html { render action: 'new' }
format.json { render json: @survey.errors, status: :unprocessable_entity }
end
end
end
def survey_params
params.require(:survey).permit(:name, questions_attributes:[:content, :id, :survey_id,
answers_attributes:[:content, :id, :questions_id]
])
end
Schließlich, hier ist die form selbst. Ich habe versucht, mit beiden f.fields_for und nur fields_for
<%= form_for(@survey) do |f| %>
<% if @survey.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@survey.errors.count, "error") %> prohibited this survey from being saved:</h2>
<ul>
<% @survey.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<%= f.fields_for :question do |builder| %>
<%= builder.label :content %>
<%= builder.text_area :content %>
<%= f.fields_for :answer do |builder| %>
<%= builder.label :content, "Answer" %>
<%= builder.text_field :content %>
<% end %>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
Die Umfrage speichert Strafe an die Datenbank, legen Sie die Fragen und Antworten nicht. Ich habe jede Ressource, die ich finden konnte, und wie es scheint, ich mache dies richtig, so ist es wirklich mich verrückt.
Diesem Beispiel ist nur ein kurzes Gerüst, so hatte ich einige code einfügen, aber ich kann nicht scheinen, um es zu arbeiten, sonst nirgends.
Bearbeiten:
die änderung meiner neuen Aktion, so etwas wie dieses:
def new
@survey = Survey.new
@survey.questions.build
end
GEARBEITET!
SEHEN TEEGS ANTWORT FÜR DIE LÖSUNG DIESES
Hier ist die neue form, die ich verwende, nur noch speichern den Namen der Umfrage
<%= f.fields_for :question do |question_builder| %>
<%= form_for(@survey) do |f| %>
<% if @survey.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@survey.errors.count, "error") %> prohibited this survey from being saved:</h2>
<ul>
<% @survey.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<%= f.fields_for :question do |question_builder| %>
<%= question_builder.label :content %>
<%= question_builder.text_area :content %>
<%= question_builder.fields_for :answer do |answer_builder| %>
<%= answer_builder.label :content, "Answer" %>
<%= answer_builder.text_field :content %>
<% end %>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
build
zu erstellen, die leeren Beziehungen, die auf Ihrem new
action im controller?Ich habe versucht, meine neue Aktion: ` def new @Umfrage = Umfrage.neue @Umfrage.Fragen.bauen Ende und es trotzdem nicht funktioniert
InformationsquelleAutor Michael | 2014-02-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht aus wie bist du mit dem falschen form builder-Objekt. Ändern Sie den Frage-Abschnitt, so etwas wie dieses:
Ursprünglich waren Sie mit der
f
Formular-generator in die Zeilef.fields_for :answers...
jedoch angesichts Ihrer Modell-code, da es eineQuestion
dassaccepts_nested_attributes_for
eineAnswer
wir tauschen Sie hierzu einfach die form-builder-Objekt für die für diequestion
Abschnitt.Hinweis: ich änderte den Namen des builder-Objekte für Klarheit.
Update
Um einen tief verschachtelten Beziehung wie diese, haben Sie, um eine Schleife durch Ihren "eingebauten" Verein (
questions
in diesem Fall), und rufen Siebuild
wieder auf seinehas_many
Vereins. So geht aus der gabrielhilal die Antwort, Sie würden dies tun:Hinweis, dass in Ihrem Fall, da Sie explizit erstellen nur eine Frage, kann man technisch tun dies stattdessen (statt der Schleife):
Haftungsausschluss: Wenn es eine sauberere, Schienen-y-Weg, dies zu tun, ich bin leider keine Ahnung davon.
Tut gabrielhilal Antwort helfen Sie überhaupt? Ich vergaß den
.build
Teil. Das könnte einen Unterschied machen.ja, es hat! Die Festsetzung der form und das hinzufügen des @ - Umfrage.Fragen.bauen, habe die Fragen zu sparen. Ich muss nur herausfinden, wie man die Antworten auch. Ich habe versucht, das hinzufügen dieser zu meinem Modell:
has_many :answers, through: :questions
- und dies zu meinem controllerdef new @survey = Survey.new @survey.questions.build @survey.answers.build end
jedoch die Antworten-Feld wird nicht angezeigt.Check out my update, lassen Sie mich wissen, ob das funktioniert.
ja, das hat funktioniert! Ich weiß nicht, warum ich damals nicht gedacht. Vielen, vielen Dank!
InformationsquelleAutor Paul Richter
In Ihrer Steuerung haben Sie
questions_id
:Ist das ein Tippfehler? Versuchen Sie auch die Einstellung
action_on_unpermitted_parameters
zu:raise
in Siedevelopment.rb
zu sehen, wenn es irgendein Attribut, dass Sie' re fehlt in Ihremsurvey_params
Methode.Nahm mir zwei ein halb Stunden mit meiner eigenen ähnlichen problem, bevor ich sah diesen Beitrag. Alles was ich tun musste, war meine
answers_attributes[]
in meinemquestions_attributes[]
. Sie sir, sind wunderbar.InformationsquelleAutor Ioannis Tziligkakis
Müssen Sie ändern Sie Ihre
new
Aktion gehören@survey.questions.build
:Aber Ihre form falsch als gut. Ändern Sie die
question
zuquestions
Müssen Sie die gleiche Sache für die Antworten.
InformationsquelleAutor gabrielhilal