我在问题模型上有一个验证方法,用于检查用户是否包含至少三个答案以及他们为测验提交的问题。如果问题未保存,则参数将保存在会话哈希中,并且重定向将返回到用户控制器show action,其中表单将从会话信息中填充。一个问题是,例如,如果用户只输入一个答案(例如,“红色”),那么表格将以“红色”两次重新填充。如果用户输入两个答案(“红色”“蓝色”),那么它将重新填充“红色”两次和“蓝色”两次以及空白字段 - 显然不是我想要的。但是,如果用户没有输入答案,则表格正在正确重建(即只有3个空白答案字段)。我无法弄清楚为什么表单值出现两次。你能根据下面的代码解释为什么会发生这种情况吗?我在循环会话信息并重建表单字段的方法中放了一个count迭代器,它只达到3(即session [:questions] hash只有三个项目),即使它复制了两组“红色“和”蓝色“答案,所以我不明白它是如何构建5个答案字段的(例如,在它创建”红色“和”蓝色“两次的情况下),
问题模型中的验证方法(问题has_many Answers和accepts_nested_attributes_for for)
validate :at_least_three_answers
def at_least_three_answers
if self.answers.reject(&:marked_for_destruction?).length < 3
self.errors[:base] << "Must have at least 3 answers"
end
end
问题创建
def create
@question = current_user.questions.build(params[:question])
if @question.save
redirect_to current_user, :notice => "Successfully created question."
else
session[:errors] = @question.errors.full_messages
session[:question] = params[:question]
redirect_to (:back), :notice => "You must not have read the instructions properly.
end
end
用户控制器中的方法,如果没有会话[:questions]
,则重新填充表单或创建新问题和答案if session[:question]
@question = @user.questions.new(session[:question])
session[:question][:answers_attributes].each do |k,v|
@question.answers.build(:content => session[:question][:answers_attributes][k][:content], :correctanswer => session[:question][:answers_attributes][k][:correctanswer])
end
session[:question] = nil
else
@question = Question.new
3.times {@question.answers.build}
end