Посмотрите, классу, которому был делегирован метод? (Rails)

#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. хорошо, понял, поэтому нет способа отменить это, потому что это просто обычный метод. Спасибо