为什么这个'validate'方法会引发ArgumentError?

时间:2011-05-12 06:00:24

标签: ruby-on-rails-3 validation activerecord arguments

民间,

我无法在我的(helloworld-y)rails应用中使用validates_with。仔细阅读原始RoR guides site的“回调和验证器”部分并搜索stackoverflow,一无所获。

这是在删除可能失败的所有内容后得到的代码的精简版本。

class BareBonesValidator < ActiveModel::Validator
  def validate    
    # irrelevant logic. whatever i put here raises the same error - even no logic at all
  end
end

class Unvalidable < ActiveRecord::Base
  validates_with BareBonesValidator
end

看起来像教科书的例子,对吗?它们在RoR guides上具有非常相似的代码段。然后我们转到rails console并在验证新记录时获得ArgumentError:

ruby-1.9.2-p180 :022 > o = Unvalidable.new
 => #<Unvalidable id: nil, name: nil, created_at: nil, updated_at: nil> 
ruby-1.9.2-p180 :023 > o.save
ArgumentError: wrong number of arguments (1 for 0)
    from /Users/ujn/src/yes/app/models/unvalidable.rb:3:in `validate'
    from /Users/ujn/.rvm/gems/ruby-1.9.2-p180@wimmie/gems/activesupport-3.0.7/lib/active_support/callbacks.rb:315:in `_callback_before_43'

我知道我错过了什么,但是什么?

(注意:为避免将BareBonesValidator放入单独的文件中,我将其保留在model/unvalidable.rb之上。

2 个答案:

答案 0 :(得分:2)

validate函数应将记录作为参数(否则您无法在模块中访问它)。指南中缺少它,但the official doc是正确的。

class BareBonesValidator < ActiveModel::Validator
  def validate(record)
    if some_complex_logic
      record.errors[:base] = "This record is invalid"
    end
  end
end

编辑:它已经在the edge guide修复了。

答案 1 :(得分:1)

错误ArgumentError: wrong number of arguments (1 for 0)表示使用validate参数调用1方法,但该方法已定义为采用0参数。

因此,请按照以下方法定义您的validate方法,然后重试:

class BareBonesValidator < ActiveModel::Validator
  def validate(record) #added record argument here - you are missing this in your code
    # irrelevant logic. whatever i put here raises the same error - even no logic at all
  end
end