Причина вызова метода экземпляра для класса в Ruby? - PullRequest
0 голосов
/ 27 апреля 2018

Я хотел бы знать, есть ли какая-либо конкретная причина для этого или это глупая ошибка, совершенная кем-то (или это что-то еще, чего я не понимаю).

class SomeMailer < ActionMailer::Base
  def first_method(user)
    mail(to: user.email, subject: "Testing")
  end
end

Этот метод вызывается в другом месте кода следующим образом

SomeMailer.first_method(user).deliver

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

ActionMailer::Base классы странные ... Да, вы действительно вызываете методы экземпляра класса - что, очевидно, не будет работать для "нормальных" классов!

Но есть некоторая магия метапрограммирования под капотом :

module ActionMailer
  class Base < AbstractController::Base
    def method_missing(method_name, *args) # :nodoc:
      if action_methods.include?(method_name.to_s)
        MessageDelivery.new(self, method_name, *args)
      else
        super
      end
    end
  end
end

Если вы посмотрите документацию по rails , вы увидите, что вызов методов экземпляра для класса, как ни странно, обычная вещь для почтовых программ.

0 голосов
/ 27 апреля 2018

Я постараюсь ответить на этот вопрос, поскольку сам сталкивался с подобными ситуациями, работая над существующим кодом.

Подобные методы экземпляра в классе помогают, когда вы вызываете обратные вызовы класса. Например, если вы хотите выполнить какое-либо действие над объектом, созданным из этого класса.

Скажем, у вас есть другой класс Пользователь , и вы хотите отправить электронное письмо пользователю сразу после создания нового пользователя. В этом случае вы можете вызвать этот метод для этого объекта, выполнив

after_save :method_name

0 голосов
/ 27 апреля 2018

Вот как рельсы предназначены для работы. В направляющих рельсов также упоминается, что

Вы никогда не создаете экземпляр своего почтового класса. Скорее, вы просто вызываете метод, который вы определили в самом классе.

Rails выполняет внутреннюю обработку, вызывая method_missin. По сути, любой метод действия, определенный в классе почтовой программы, будет перехвачен method_missing и вернет экземпляр MessageDelivery, в противном случае он запускает реализацию по умолчанию. И откуда берутся методы действия? ActionMailer :: Base наследуется от AbstractController :: Base, поэтому он работает точно так же, как и для контроллеров - он возвращает набор открытых методов экземпляра данного класса.

Рельсы сами поощряют такое поведение. За дополнительной информацией вы можете обратиться по этой ссылке

...