Rails 4 imbriqués les attributs de ne pas épargner
Je ne peux pas sembler obtenir imbriqués les attributs pour enregistrer dans la base de données. Je suis à l'aide de Rails 4.
Voici mes modèles :
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
Ici est le contrôleur:
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
Enfin, ici, c'est la forme elle-même. J'ai essayé d'utiliser à la fois f.fields_for et juste 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 %>
L'enquête enregistre la plus fine à la base de données, mettre les questions et les réponses ne seront pas. J'ai regardé toutes les ressources que j'ai pu trouver et il me semble que je suis en train de faire cela correctement, il est donc vraiment me rend fou.
Cet exemple est juste un petit échafaudage j'ai donc eu un peu de code à coller, mais je n'arrive pas à le faire fonctionner n'importe où ailleurs.
edit:
changer ma nouvelle action à quelque chose comme ceci:
def new
@survey = Survey.new
@survey.questions.build
end
TRAVAILLÉ!
VOIR TEEGS RÉPONSE POUR SOLUTION À CE
Ici est la nouvelle forme, je suis en utilisant seulement d'enregistrer le nom de l'enquête
<%= 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
à créer vide relations sur votre new
action dans le contrôleur?J'ai essayé de changer ma nouvelle action: "def @sondage = Enquê[email protected] end", et il n'a toujours pas de travail
OriginalL'auteur Michael | 2014-02-11
Vous devez vous connecter pour publier un commentaire.
Dirait que vous êtes en utilisant le mauvais objet form builder. Modifier la section question à quelque chose comme ceci:
À l'origine vous étiez à l'aide de la
f
générateur de formulaire en lignef.fields_for :answers...
, toutefois, compte tenu de votre modèle de code, car c'est unQuestion
queaccepts_nested_attributes_for
unAnswer
, nous avons simplement à l'échange de l'objet form builder pour celui qui est utilisé pour lequestion
section.Note: j'ai changé le nom du constructeur d'objets pour plus de clarté.
Mise à jour
Afin de construire une profondément imbriqués relation comme cela, vous aurez à boucle à travers votre "construit" de l'association (
questions
dans ce cas), et d'invoquerbuild
à nouveau sur sonhas_many
association. Afin d'aller hors de gabrielhilal réponse, vous voulez faire cela:Note que dans votre cas, puisque vous êtes explicitement la création d'une seule question, vous pouvez techniquement le faire à la place (au lieu de la boucle):
Avertissement: Si il n'y est plus propre, plus de Rails-y, façon de le faire, je suis malheureusement pas au courant de cela.
Ne gabrielhilal la réponse de vous aider à tous? J'ai oublié la
.build
partie. Que peut faire une différence.oui il l'a fait! La fixation de la forme et de l'ajout de la @de l'enquête.questions.construire obtenu les questions à se sauver. J'ai juste besoin de comprendre comment construire les réponses. J'ai essayé d'ajouter ce point à mon modèle :
has_many :answers, through: :questions
, et ce, pour mon contrôleurdef new @survey = Survey.new @survey.questions.build @survey.answers.build end
cependant les réponses de champ ne s'affiche pas.Découvrez ma mise à jour, laissez-moi savoir si cela fonctionne.
oui! Je ne sais pas pourquoi je n'avais pas pensé à ça. Merci beaucoup!
OriginalL'auteur Paul Richter
Dans votre controller, vous avez
questions_id
:Est qu'une faute de frappe? Aussi, essayez de régler une
action_on_unpermitted_parameters
à:raise
en vousdevelopment.rb
pour voir si il n'y a aucun attribut qui vous manque dans votresurvey_params
méthode.M'a pris deux d'un demi heures avec mon propre problème similaire avant, j'ai vu ce post. Tout ce que j'avais à faire était de mettre mon
answers_attributes[]
à l'intérieur de monquestions_attributes[]
. Vous, monsieur, sont merveilleux.OriginalL'auteur Ioannis Tziligkakis
Vous devez changer votre
new
d'action pour inclure@survey.questions.build
:Mais votre formulaire de mal que de bien. Modifier la
question
àquestions
Vous devez faire la même chose pour les réponses.
OriginalL'auteur gabrielhilal