2014-02-04 3 views
3

В контроллере, у меня есть:частный метод `новый 'призвал MyReminderMailer: Класс

mailer = MyReminderMailer.new 

почтовая программа выглядит следующим образом:

class MyReminderMailer < ActionMailer::Base 
    def change_email 
    mail(
     from:  default_from, 
     to:  default_to, 
     subject: "..." 
    ) 
    end 

    def default_from 
    return '...' 
    end 

    def default_to 
    return '...' 
    end 
end 

но получил сообщение об ошибке: частный метод` новый' называется для MyReminderMailer: класс

ответ

12

ActionMailer::Base имеет довольно тупой и неинтуитивный API. Подобно контроллерам, вы никогда явно не создаете экземпляры своих почтовых программ. Вместо этого вы взаимодействуете с ними как с классами. new помечен как private в ActionMailer::Base, а вызовы методов класса затем маршрутизируются через method_missing в новый экземпляр. Как я сказал, неинтуитивно.

Дополнительную информацию о правильном использовании ActionMailer см. В guides и api docs.

+5

«goofy and unintuitive» является благотворительным, я бы, вероятно, использовал сильный язык :) –

3

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

SomeClass.send :method_name 

#in your case 
MyReminderMailer.send :new 

И вам не нужен объект ActionMailer. Чтобы отправить почту, просто используйте метод как метод класса.

MyReminderMailer.change_email.deliver 

Надеюсь, это может вам помочь.

Смежные вопросы