Является ли 'valid' зарезервированным именем в DataMapper? - PullRequest
2 голосов
/ 28 марта 2011

У меня есть следующая модель в 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 ]

5 голосов
/ 28 марта 2011

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

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

2 голосов
/ 28 марта 2011

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

  `myinstance.methods`

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

...