Действительно ли зарезервированное имя в 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", но теперь мне это очень интересно.

Спасибо


person fernferret    schedule 28.03.2011    source источник


Ответы (2)


#действительный? это метод, который добавляет dm-validations. Вы не можете использовать «действительный» в качестве имени свойства, потому что оно автоматически определяет «действительный?» метод для логического типа свойства, который отменяет валидацию dm-validations ?. Отсюда и ошибка.

Это сложная ситуация, я думаю, нам нужно улучшить способ проверки имен свойств. Спасибо, что сообщили об этом.

person solnic    schedule 28.03.2011
comment
Ух ты, огромное тебе спасибо за это! Есть ли способ, кроме вызова instance.methods (как указано @ michael-papile в другом ответе), чтобы найти все эти методы, поскольку вызов instance.methods даст мне все, что я определил, объединенный с вещами, определенными другими объектами, такими как DataMapper - person fernferret; 28.03.2011
comment
Все методы, зарезервированные DM Property, перечислены в константе DataMapper :: Property :: INVALID_NAMES. Обнаруженная вами проблема вызвана тем, что Property проверяет только свое имя, а в случае логического свойства также следует проверять # {name}? который также будет определен и может конфликтовать с уже существующим методом. - person solnic; 28.03.2011
comment
Просто к сведению - DataMapper 1.1.1 будет включать улучшенную проверку имени свойства, которая вызовет исключение, если вы попытаетесь использовать допустимое значение в качестве имени. - person solnic; 01.04.2011

Способ работы datamapper заключается в том, что он использует method_missing в конце цепочки вызовов методов и находит ваше свойство. Если существует метод с таким же именем, то вызывается он, а не ваше свойство. Datamapper смешивается с Validatable, у которого метод действителен? В большинстве случаев вы изучаете, что зарезервировано (как и все Object методы и т. Д.). Но если вам нужен полный список, вы можете:

  `myinstance.methods`

Все, что там появляется, будет вызвано первым.

person Michael Papile    schedule 28.03.2011
comment
Принятый ответ предоставляет решение, которое я искал, НО, я был глуп, пытаясь понять это, и звонил Student.methods, а не так, как вы указали instance.methods, так что большое вам спасибо и за это! - person fernferret; 28.03.2011