Ruby on rails 产生重复结果的嵌套表单更新操作
在嵌套窗体的更新操作期间,它似乎创建了新的嵌套记录,而不是更新当前的嵌套记录 这就是我的控制器的外观:Ruby on rails 产生重复结果的嵌套表单更新操作,ruby-on-rails,nested-forms,nested-attributes,Ruby On Rails,Nested Forms,Nested Attributes,在嵌套窗体的更新操作期间,它似乎创建了新的嵌套记录,而不是更新当前的嵌套记录 这就是我的控制器的外观: class ApplicationsController < ApplicationController before_filter :set_user_and_job def new job = params[:job_id] @application = Application.build(job) end def create @ap
class ApplicationsController < ApplicationController
before_filter :set_user_and_job
def new
job = params[:job_id]
@application = Application.build(job)
end
def create
@application = Application.new(application_params)
@application.save
redirect_to root_url, :notice => "You have now applied!"
end
def edit
@application = Application.find(params[:id])
@answers = []
@job.questions.each do |question|
@application.answers.each do |answer|
@answers << answer if answer.question_id == question.id
end
end
end
def update
@application = Application.find(params[:id])
@application.update_attributes(application_params)
redirect_to root_url, :notice => "You have updated your application!"
end
def destroy
Application.find(params[:id]).destroy
flash[:success] = "Application Deleted."
redirect_to root_url
end
def show
@application = Application.find(params[:id])
@answers = []
@job.questions.each do |question|
@application.answers.each do |answer|
@answers << answer if answer.question_id == question.id
end
end
end
private
def set_user_and_job
@user = current_user
@job = Job.find(params[:job_id])
end
def application_params
params.require(:application).permit(:job_id, :user_id, answers_attributes:[:question_id, :content]).merge(user_id: current_user.id, job_id: params[:job_id])
end
end
<% provide(:title, " Edit this application") %>
<div class="row">
<div class="span6">
<h2> Job: <%= @job.job_title %></h2>
<p> <%= @job.job_summary %> </p>
</div>
<div class="span6">
<h2> Applicant: <%= @user.name %></h2>
</div>
<div class="span12">
<h3>Edit your job application below.</h3>
</div>
</div>
<%= form_for [@job, @application] do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<% @job.questions.each_with_index do |question| %>
<%= f.fields_for :answers, question do |question_field| %>
<%= question_field.label :content, question.content %>
<%= question_field.text_area :content, :value => "" %>
<%= question_field.hidden_field :question_id, :value => question.id %>
<% end %>
<% end %>
<%= f.submit "Submit the application", class: "button" %>
<% end %>
(这也有点奇怪,因为答案的实际id是39。5实际上是问题的id:s)
你对此有何看法?非常感谢SO的导师的帮助:)尝试将
仅更新
添加到调用接受
的嵌套属性中
accepts_nested_attributes_for :nested_attribute, update_only: true
仅更新不适用于多个关系。您需要将嵌套的attribute:id字段添加到强参数:
def application_params
params.require(:application).permit(:job_id, :user_id,
answers_attributes:[:id, :question_id, :content]).merge(user_id: current_user.id,
job_id: params[:job_id])
end
嗨,bw,我添加了它,但它似乎仍在生成重复记录。如果我能提供更多信息来帮助推断,请告诉我。嗨,菲利普,谢谢你的回复。添加:id参数后,我得到一个NoRecordFound错误。这可能是因为Rails不知何故将问题id误认为答案id,或者我不确定发生了什么。错误在上面的帖子里。你对此有什么想法?更新:Philip需要:id是对的。我之所以得到这个名字是因为我的观点。我没有运行jobs.question.each,然后在它下面运行form_for,而是编写form_for,然后通过编写question_field.object.question.content来获取问题。
ActiveRecord::RecordNotFound in ApplicationsController#update
Couldn't find Answer with ID=5 for Application with ID=17
accepts_nested_attributes_for :nested_attribute, update_only: true
def application_params
params.require(:application).permit(:job_id, :user_id,
answers_attributes:[:id, :question_id, :content]).merge(user_id: current_user.id,
job_id: params[:job_id])
end