2011-05-26 73 views
3

我正在寻找将值传递给自定义验证。我已经做了以下的测试:Rails 3 - 将参数传递给自定义验证方法

validate :print_out, :parameter1 => 'Hello'

有了这个:“空白”

def print_out (input="blank") 
    puts input 
end 

当创建一个对象或保存对象时,输出为但是,如果直接调用:

object.print_out "Test"

测试,而不是输出。问题是,为什么我的参数不能正确传递?

回答

11

在'config \ initializers \'目录中,您可以创建自己的验证。作为一个例子,我们来创建一个验证'validates_obj_length'。不是一个非常有用的验证,但是一个可接受的示例:

在'config \ intializers \'目录内创建'obj_length_validator.rb'文件。

ActiveRecord::Base.class_eval do 
    def self.validates_obj_length(*attr_names) 
     options = attr_names.extract_options! 
     validates_each(attr_names, options) do |record, attribute, value| 
      record.errors[attribute] << "Error: Length must be " + options[:length].to_s unless value.length == options[:length] 
     end 
    end 
end 

一旦你有了这个,你可以使用很干净:

validates_obj_length :content, :length => 5 

基本上,我们重新开始的ActiveRecord :: Base类并实现新的子验证。我们使用splat(*)运算符来接受一组参数。然后我们将选项的散列提取到我们的'选项'变量中。最后我们实施我们的验证。这使验证可随时用于任何模型并保持干爽!

2

你可以尝试

validate do |object_name| 
    object_name.print_out "Hello" 
end 

而不是你的validate:print_out,:参数1 => '你好'。

+0

虽然这确实起作用,但它感觉不太干净。我尝试无效的方式吗? – Serodis 2011-05-26 01:31:13