Rails3-将一个参数传递给自定义验证方法



我希望将一个值传递给自定义验证。我做了以下测试:

validate :print_out, :parameter1 => 'Hello'

有了这个:

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

创建对象或保存对象时,输出为"空白"但是,如果直接调用:

object.print_out "Test"

取而代之的是输出测试。问题是,为什么我的参数没有正确传递?

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

在"config\Initializers\"目录中创建文件"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::基类并实现一个新的子验证。我们使用splat(*)运算符来接受一组参数。然后,我们将选项的散列提取到我们的"options"变量中。最后,我们实现了验证。这使得验证可以在任何时间与任何模型一起使用,并保持干燥!

您可以尝试

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

不是验证:print_out,而是:parameter1=>"你好"。

相关内容

  • 没有找到相关文章

最新更新