我在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',但现在我真的很好奇。
由于
答案 0 :(得分:5)
#valid?是dm-validations添加的方法。您不能将“valid”用作属性名称,因为它会自动定义“valid?”布尔属性类型的方法,它覆盖dm-validations'有效?因此错误。
这是一个棘手的情况,我想我们需要改进我们验证属性名称的方式。感谢您报告此事。
答案 1 :(得分:2)
数据管理器的工作方式是,它在方法调用链的末尾使用method_missing
并找到您的属性。如果存在具有相同名称的方法,则调用该方法而不是您的属性。 Datamapper混合在Validatable
中,该方法有效吗?大部分时间你都在学习保留的东西(比如所有的Object
方法等)但是如果你想要一个完整的列表,你可以这样做:
`myinstance.methods`
在那里出现的任何东西都会先被调用。