伙计们,
我无法在我的(helloworld-y)rails应用程序中validates_with
工作。通读原始RoR指南站点的"回调和验证器"部分并搜索堆栈溢出,一无所获。
这是我删除所有可能失败的代码后获得的精简版本。
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 指南上有非常相似的片段。然后我们转到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
上)。
validate
函数应将记录作为参数(否则无法在模块中访问它)。指南中缺少它,但官方文档是正确的。
class BareBonesValidator < ActiveModel::Validator
def validate(record)
if some_complex_logic
record.errors[:base] = "This record is invalid"
end
end
end
编辑:它已经在边缘导轨中修复。
错误ArgumentError: wrong number of arguments (1 for 0)
表示使用1
参数调用validate
方法,但该方法已定义为接受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