2011-03-28 29 views
2

我在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-驗證'(1.1.0版本),開始我的末日的應用程序後,我收到以下消息:

/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',但現在我只是很好奇這一點。

謝謝

回答

5

#valid?是dm-validations添加的方法。您不能使用「有效」作爲屬性名稱,因爲它會自動定義「有效」?方法爲布爾屬性類型覆蓋dm-validations的有效?因此錯誤。

這是一個棘手的情況,我想我們需要改進我們驗證屬性名稱的方式。感謝您報告這一點。

+0

哇,非常感謝你!有沒有一種方法,除了調用'instance.methods'(正如@ michael-papile在另一個答案中指出的)來查找所有這些方法,因爲調用'instance.methods'會給我所有我定義的聯合由DataMapper等其他對象定義的東西 – Eric 2011-03-28 16:54:00

+1

由DM屬性保留的所有方法在DataMapper :: Property :: INVALID_NAMES常量中列出。 您發現的問題是由於Property僅驗證其名稱,如果是布爾屬性,它還應該檢查「#{name}?」這也將被定義並可能與已有的方法相沖突。 – solnic 2011-03-28 18:07:46

+1

Just FYI - DataMapper 1.1.1將包含一個改進的屬性名稱驗證,如果您嘗試使用「valid」作爲名稱,將會引發異常。 – solnic 2011-04-01 12:50:39

2

數據映射器的工作方式是,它在方法調用鏈的末尾使用method_missing並找到您的屬性。如果有一個具有相同名稱的方法,那麼調用該方法而不是您的屬性。 Datamapper混合在Validatable哪個方法有效?大多數時候,你所學到的保留(所有Object方法等等等)但是,如果你想有一個完整的列表,你可以這樣做:出現會有先被稱爲

`myinstance.methods` 

什麼。

+0

接受的答案提供了我正在尋找的解決方案,但是,當我試圖找出它並且正在調用'Student.methods',而不是像您指出'instance.methods'時那樣愚蠢,所以非常感謝這個也是! – Eric 2011-03-28 16:44:02