Respond_to в сочетании с псевдонимом метода в Rails - PullRequest
1 голос
/ 12 сентября 2011

В плагине, который я пишу, я использую псевдоним для переопределения одного из валидаторов Rails по умолчанию, например:

# Alias the original validator so it's still available under a different name
alias original_validates_uniqueness_of :validates_uniqueness_of unless method_defined?(:original_validates_uniqueness_of)
# Then alias the custom validator under the original name
alias validates_uniqueness_of :custom_validates_uniqueness_of

Все это работает довольно хорошо.Когда «validates_uniqueness_of» определено для атрибута в модели AR, вместо него будет использоваться мой метод «custom_validates_uniqueness_of».Проверки выполняются, как и ожидалось.

Однако, когда я звоню:

SomeARclass.respond_to?(:validates_uniqueness_of)

.., он возвращает false.Такое поведение будет мешать нескольким популярным плагинам.

Мой вопрос :
Почему response_to возвращает "false"?Является ли это поведение результатом наложения?Как настроить мой пользовательский валидатор, чтобы он возвращал значение true?

Спасибо за помощь.
Эрвин

1 Ответ

0 голосов
/ 12 сентября 2011

Ваш образец на поверхности выглядит так, как будто он должен работать. Я полагаю, вы обнаружили, что внутри тела класса для class SomeARclass вы можете вызвать validates_uniqueness_of.

class SomeARclass
  validates_uniqueness_of :first_field # works
end

Однако я ожидаю, что scoped_validates_uniqueness_of это частный метод. Вот почему вы не смогли отправить это сообщение на SomeARclass за пределами его тела класса.

SomeARclass.validates_scoped_uniqueness_of :first_field # fails
#=> NoMethodError: private method "validates_scoped_uniqueness_of" called
    for SomeARclass:Class

Когда вы псевдоним частного метода с новым именем, например псевдоним частного метода validates_scoped_uniqueness_of с новым именем validates_uniqueness_of, этот новый метод также является закрытым. Я ожидаю, что это произошло здесь.

Документация для #respond_to? гласит:

- (Boolean) respond_to?(symbol, include_private = false)

Возвращает true, если obj отвечает на данный метод. Частные методы включаются в поиск, только если необязательный второй параметр оценивается как true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...