2013-01-24 18 views
3

我想動態驗證一個對象。Rails元編程10 x 0我

在我的應用程序中,用戶可以創建將成爲表單一部分的問題,每個問題可以有 驗證。

所以,我張貼這種形式,並且帕拉姆傳遞到下面的類:

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串聯::錯誤

#<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"]}> 

我在做什麼錯?

謝謝!

亞歷

回答

0

add_validators被調用上的QuestionResponse每個實例,這將增加驗證到類的QuestionResponse。每個新實例都將它自己的驗證添加到類中,但您仍然有其他(先前創建的)實例添加的驗證。

+0

不self.class.instance_eval是否僅添加到當前實例?如果不是,有沒有辦法做到這一點?謝謝! –

+1

您在QuestionResponse上調用instance_eval,所以最終修改了QuestionResponse類 – aromero