“有效”是DataMapper中的保留名称吗?

时间:2011-03-28 15:29:14

标签: ruby validation sinatra datamapper

我在datamapper中有以下模型:

class Student
  include DataMapper::Resource
  property :id,          Serial
  # <snip>
  property :permissions, String, :accessor => :protected, :required => true, :default => 'standard'
  property :valid,       Boolean, :default => false, :required => true
  # <snip>
end

在要求'dm-validations'(版本1.1.0)并启动我的Sinatra应用程序后,我收到以下消息:

/Library/Ruby/Gems/1.8/gems/dm-validations-1.1.0/lib/dm-validations.rb:81:in `valid?': wrong number of arguments (1 for 0) (ArgumentError)
    from /Library/Ruby/Gems/1.8/gems/dm-validations-1.1.0/lib/dm-validations.rb:81:in `save_self'
    from /Library/Ruby/Gems/1.8/gems/dm-core-1.1.0/lib/dm-core/resource.rb:1007:in `_save'
    from /Library/Ruby/Gems/1.8/gems/dm-core-1.1.0/lib/dm-core/resource.rb:1223:in `run_once'
    from /Library/Ruby/Gems/1.8/gems/dm-core-1.1.0/lib/dm-core/resource.rb:1006:in `_save'
    from /Library/Ruby/Gems/1.8/gems/dm-core-1.1.0/lib/dm-core/resource.rb:406:in `save'
    from /Library/Ruby/Gems/1.8/gems/dm-validations-1.1.0/lib/dm-validations.rb:69:in `save'
    from /Library/Ruby/Gems/1.8/gems/dm-validations-1.1.0/lib/dm-validations/support/context.rb:30:in `validation_context'
    from /Library/Ruby/Gems/1.8/gems/dm-validations-1.1.0/lib/dm-validations.rb:69:in `save'
<snip>

我正在为我的模型使用的'有效'名称是保留字吗?如果是,我在哪里可以找到这些单词。我接着试着给它起名字:'student_valid',但现在我真的很好奇。

由于

2 个答案:

答案 0 :(得分:5)

#valid?是dm-validations添加的方法。您不能将“valid”用作属性名称,因为它会自动定义“valid?”布尔属性类型的方法,它覆盖dm-validations'有效?因此错误。

这是一个棘手的情况,我想我们需要改进我们验证属性名称的方式。感谢您报告此事。

答案 1 :(得分:2)

数据管理器的工作方式是,它在方法调用链的末尾使用method_missing并找到您的属性。如果存在具有相同名称的方法,则调用该方法而不是您的属性。 Datamapper混合在Validatable中,该方法有效吗?大部分时间你都在学习保留的东西(比如所有的Object方法等)但是如果你想要一个完整的列表,你可以这样做:

  `myinstance.methods`

在那里出现的任何东西都会先被调用。