Путаница в методах Rails ActionMailer

Я внедрил систему аутентификации с помощью authlogic и добавил функцию сброса пароля в соответствии с этим руководством http://github.com/rejeep/authlogic-password-reset-tutorial

Все работает, но я не понимаю, почему это так.

Есть этот код..

class User < ActiveRecord::Base
  def deliver_password_reset_instructions!
    reset_perishable_token!
    Notifier.deliver_password_reset_instructions(self)
  end
end

и это

class Notifier < ActionMailer::Base
  def password_reset_instructions(user)
    subject      "Password Reset Instructions"
    from         "[email protected]"
    recipients   user.email
    content_type "text/html"
    sent_on      Time.now
    body         :edit_password_reset_url => edit_password_reset_url(user.perishable_token)
  end
end

Меня смущает эта строчка

Notifier.deliver_password_reset_instructions(self)

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

password_reset_instructions

без бита deliver_.

Так что здесь происходит? как это все работает?


person pingu    schedule 17.10.2010    source источник


Ответы (2)


Отличный вопрос, многие люди забывают задать эти вопросы.

Вы заметили, что вы никогда не создаете экземпляры своих объектов класса почтовой программы. Методы вашего почтового класса обычно обертываются этим deliver_<method_name>

Итак, внутри используется концепция method_missing в ruby. Предположим, вы вызываете определенный метод в ruby, который не существует для этого объекта, ruby ​​​​вызывает метод method_missing. Который определен в коде «ActionMailer::Base».

def method_missing(method_symbol, *parameters)#:nodoc:
  case method_symbol.id2name
    when /^create_([_a-z]\w*)/  then new($1, *parameters).mail
    when /^deliver_([_a-z]\w*)/ then new($1, *parameters).deliver!
    when "new" then nil
    else super
  end
end

поэтому, если метод соответствует «доставке_» и любой комбинации букв нижнего регистра, Rails создает экземпляр вашего класса Mailer (вызывая «новый») и отправляет его с параметрами в инициализатор и вызывает «доставить!» метод, чтобы, наконец, доставить почту.

То же самое касается методов типа «create_‹method_name›».

person Rishav Rastogi    schedule 17.10.2010
comment
Большое спасибо за ваше подробное объяснение, теперь это имеет смысл. - person pingu; 17.10.2010

Это соглашение Rails 2 ActionMailer.

Чтобы доставить электронное письмо, используйте YourMailerClass.deliver_NAME_OF_THE_METHOD. Чтобы инициализировать электронное письмо, используйте YourMailerClass.create_NAME_OF_THE_METHOD.

Rails автоматически создаст экземпляр класса Mailer, вызовет ваш метод и доставит объект электронной почты.

person Simone Carletti    schedule 17.10.2010