我正在尝试动态验证对象。

在我的应用程序上,用户可以创建将成为表单一部分的问题,每个问题可以包含
验证。

因此,我发布了此表单,并将参数传递给以下类:

require 'ostruct'
class QuestionResponse < OpenStruct
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend  ActiveModel::Naming
  extend  ActiveModel::Callbacks

  def fields
    @table.keys
  end

  def add_validators
    stored_questions = AdmissionForm.find(self.form_id).questions.all
    questions = fields.select{|f| f.to_s[0]=="q"}
    questions.each do |question_param|
      question = stored_questions.select{|f| f["id"] == question_param.to_s.gsub("q_","").to_i}.first
      unless question.validations.empty?
        validations = "validates :#{question_param} , #{question.validations.join(",")}"
        self.class.instance_eval validations
      end
    end

  end

  def initialize(*args)
    super
    add_validators if self.fields.any?
  end
  def persisted? ; false ; end;
end


它几乎可以工作。
我的问题是后续表单发布会串联ActiveModel :: Errors

#<ActiveModel::Errors:0x00000004432520
 @base=#<QuestionResponse q_7="", q_6="", form_id="1">,
 @messages=
  {:q_7=>["cant be blank", "cant be blank"],
   :q_6=>["cant be blank", "cant be blank"]}>


我究竟做错了什么?

谢谢!

亚历克斯

最佳答案

add_validators的每个实例上调用QuestionResponse,这会将验证添加到QuestionResponse的类中。每个新实例都将自己的验证添加到类中,但是您仍然具有其他(先前创建的)实例添加的验证。

09-16 15:50