#ruby-on-rails #ruby #ruby-on-rails-5.2
#ruby-on-rails #ruby #ruby-on-rails-5.2
Вопрос:
Если я использую delegate :Mayfield, to: :user
Что я могу вызвать в :Mayfield, чтобы увидеть, что он был делегирован классу:user?
РЕШЕНИЕ: НЕВОЗМОЖНО
Комментарии:
1. Вы хотите сделать это в целях тестирования или для размышления во время выполнения фактического приложения?
2. Я не совсем в состоянии ответить на ваш вопрос, но если вы посмотрите на исходный код, может быть, это могло бы помочь? github.com/rails/rails/blob/master/activesupport/lib /…
3. @milgner во время выполнения приложения. У меня есть объект form с несколькими моделями и, используя simple_form, он использует:type_for_attribute , :has_attribute? но мне нужно придумать способ его динамического делегирования.
Ответ №1:
Как уже указывал @BKSpurgeon, реализация delegate
метода не делает ничего, кроме создания метода, который вызывает данный метод для объекта.
Как такового «динамического» делегирования нет: просто реализуйте обычный метод с тем же именем, и пусть он возвращает любое значение, которое вам нужно.
def Mayfield
case some_attribute_value
when 'foo' then user.Mayfield
when 'bar' then something_else.Mayfield
end
end
Комментарии:
1. Где хранится созданный метод? Как я хотел бы посмотреть метод, чтобы найти класс, которому он был делегирован? У меня делегировано большое количество атрибутов, и было бы проще получить доступ к информации, чем беспокоиться об обновлении инструкции case после каждого изменения в делегировании.
2. Это просто обычные методы. Оператор в вашем вопросе приведет к коду
def Mayfield; user.Mayfield; end
(здесь не удается его правильно отформатировать). Это точно так же, как если бы вы написали это самостоятельно, за исключением того, что он также может выполнятьnil
проверки.3. хорошо, понял, поэтому нет способа отменить это, потому что это просто обычный метод. Спасибо