2011-05-26 170 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