gpt4 book ai didi

ruby-on-rails - Rails 4 嵌套属性不保存

转载 作者:数据小太阳 更新时间:2023-10-29 06:43:56 25 4
gpt4 key购买 nike

我似乎无法将嵌套属性保存到数据库中。我正在使用 Rails 4。

这是我的模型:

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

这是 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

最后,这是表单本身。我尝试同时使用 f.fields_for 和 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 %>

调查问卷保存到数据库中,问题和答案不会放。我查看了我能找到的所有资源,看起来我做的是正确的,所以这真的让我发疯。

这个例子只是一个快速的脚手架,所以我有一些代码可以粘贴进去,但我似乎无法让它在其他任何地方工作。

编辑:将我的新操作更改为类似这样的内容:

def new
@survey = Survey.new
@survey.questions.build
end

成功了!

请参阅 TEEGS 答案以了解此问题的解决方案

这是我正在使用的新表格,仍然只保存调查名称

  <%= 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 %>

最佳答案

您似乎使用了错误的表单生成器对象。将问题部分更改为如下内容:

<%= 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 %>

最初您在 f.fields_for :answers... 行中使用了 f 表单生成器,但是给定了您的模型代码,因为它是一个 Question accepts_nested_attributes_for 一个 Answer,我们只需将表单生成器对象替换为用于 question 部分的对象。

注意:为清楚起见,我更改了构建器对象的名称。

更新

为了构建像这样的深层嵌套关系,您必须循环遍历“构建的”关联(在本例中为questions),然后再次调用build在其 has_many 关联上。所以离开 gabrielhilal 的回答,你会这样做:

def new
@survey = Survey.new
@survey.questions.build
@survey.questions.each do |question|
question.answers.build
end
end

请注意,在您的情况下,由于您明确地只创建了一个问题,因此从技术上讲,您可以改为执行此操作(而不是循环):

@survey.questions.first.answers.build

免责声明:如果有更简洁、更符合 Rails 风格的方法来做到这一点,我很遗憾没有意识到。

关于ruby-on-rails - Rails 4 嵌套属性不保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21711556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com