在验证失败时创建重复字段

时间:2013-02-28 21:05:18

标签: ruby-on-rails

我在问题模型上有一个验证方法,用于检查用户是否包含至少三个答案以及他们为测验提交的问题。如果问题未保存,则参数将保存在会话哈希中,并且重定向将返回到用户控制器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

0 个答案:

没有答案