о вызове метода класса ruby - PullRequest
       2

о вызове метода класса ruby

0 голосов
/ 17 декабря 2010

в rails3 я определил класс

#coding:utf-8
class CoreMail < ActionMailer::Base
  def consulting_reply(email)
    mail(:to => email, :subject => 'ssss')

  end



end

я обнаружил, что могу вызывать этот метод следующим образом

CoreMail.consulting_reply(email)

но хочу, чтобы я думал, что правильный путь:

instance=CoreMail.new
instance.consulting_reply(email)

, поскольку consulting_reply - это метод экземпляра,

я что-то упустил?надеюсь, кто-нибудь может мне помочь

Ответы [ 2 ]

2 голосов
/ 17 декабря 2010

ActionMailer::Base имеет method_missing, определенный на нем:

def method_missing(method, *args) #:nodoc:
  return super unless respond_to?(method)
  new(method, *args).message
end

Это вызовет ваш метод экземпляра с теми же аргументами, а затем вызовет метод message, возвращая объект этого почтового вызова. Чтобы доставить его, вызовите deliver! в конце вызова метода:

CoreMail.consulting_reply(email).deliver!
0 голосов
/ 17 декабря 2010

Вы правы, обычно это будет метод экземпляра, и вам придется создать экземпляр класса перед вызовом consulting_reply () (поскольку он не определен как self.consulting_reply).Однако ваш класс унаследован от ActionMailer :: Base, и за кулисами происходит небольшое волшебство рубина.Проверьте исходный код ActionMailer :: Base, чтобы увидеть его сами (https://github.com/rails/rails/blob/master/actionmailer/lib/action_mailer/base.rb),, но чтобы упростить для вас происходящее, вот быстрый пример:

class Test
  def self.method_missing(method, *args)
    puts "Called by a non class method"
  end
end

Test.fake_class_method

, который выдаст:

Calledне классовым методом

ActionMailer :: Base делает нечто похожее на это, который динамически ищет вызванный вами метод. Я считаю, что он также создает экземпляр класса, используя:

new(method, *args).message

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

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