2015-08-12 4 views
1

Я пытаюсь выяснить, как отправить новых пользователей приветственное письмо.Rails Observers & Mailer

вчера https://stackoverflow.com/questions/31934734/rails-mailer-no-method-error?noredirect=1#comment51781688_31934734 Я задал этот вопрос он отвергнут (я не знаю, как выяснить, почему) и был не в состоянии получить любую конструктивную помощь.

С тех пор я нашел рельсы-наблюдатель и попробовал другой подход.

Моя проблема в том, что когда я нажимаю эту кнопку и пытаюсь ее выполнить, появляется сообщение об ошибке: NameError (неинициализированная константа UserObserver :: Mailer).

Мое понимание этой ошибки состоит в том, что нет модели, которая соответствует имени наблюдателя. У меня определенно есть модель user.rb, и у меня также есть файл в моем приложении под названием Mailer.

У меня есть следующие настройки:

В моей модели папке, у меня есть user_observer.rb:

class UserObserver < ActiveRecord::Observer 
    def after_save(user) 
     Mailer.welcome_mail(user).deliver! 
    end 
end 

Пользователь/Registration_controller:

def create 
     @user = User.new(user_params) 

     respond_to do |format| 
      if resource.save 

      format.html { redirect_to(profiles_path)} 
      else 
      format.html { render action: 'new' } 
      format.json { render json: @user.errors, status: :unprocessable_entity } 
      end 
     end 
     end 

app/mailers/welcome_mail.rb:

class WelcomeMail < ActionMailer::Base 
    self.delivery_method = :smtp 
    self.smtp_settings = { 
    user_name:   ENV['WELCOME'], 
    password:    ENV['D_WELCOME'], 
    port:     ..., 
    domain:    'gmail.com', 
    address:    'smtp.gmail.com', 
    authentication:  'plain', 
    enable_starttls_auto: true 
    } 


def new_user_waiting_for_access(user) 
    @user = user 
    mail(to: user.email, from: "[email protected]", subject: "Welcome #{user.first_name}") 
end 
end 

User.rb:

def send_user_welcome_mail 
    AdminMailer.new_user_waiting_for_access(self).deliver 
    end 

application.rb:

config.active_record.observers = :user_observer 

Специфическая ошибка:

NameError (uninitialized constant UserObserver::Mailer): 
2015-08-12T03:14:33.002104+00:00 app[web.1]: app/models/user_observer.rb:3:in `after_save' 
2015-08-12T03:14:33.002106+00:00 app[web.1]: app/controllers/users/registrations_controller.rb:21:in `block in create' 
2015-08-12T03:14:33.002108+00:00 app[web.1]: app/controllers/users/registrations_controller.rb:20:in `create' 
2015-08-12T03:14:33.002109+00:00 app[web.1]: 
2015-08-12T03:14:33.002110+00:00 app[web.1]: 
2015-08-12T03:14:33.002111+00:00 app[web.1]: 
2015-08-12T03:14:33.002113+00:00 app[web.1]: NameError (uninitialized constant UserObserver::Mailer): 
2015-08-12T03:14:33.002114+00:00 app[web.1]: app/models/user_observer.rb:3:in `after_save' 
2015-08-12T03:14:33.002116+00:00 app[web.1]: app/controllers/users/registrations_controller.rb:21:in `block in create' 
2015-08-12T03:14:33.002117+00:00 app[web.1]: app/controllers/users/registrations_controller.rb:20:in `create' 
2015-08-12T03:14:33.002118+00:00 app[web.1]: 

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

Содержание сообщения электронной почты указано в виде: welcome_mail.html.erb.

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

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

ответ

2

В вашем опубликованном коде у вас есть следующее: Mailer.welcome_mail(user).deliver!, что неверно, потому что у вас нет определенного класса Mailer и нет метода welcome_mail, поэтому этот подход неверен.

Я думаю, что вы хотите использовать определенный класс почтовой WelcomeMail и внутри WelcomeMail класса вы должны определить welcome_mail метод, где вы положили логику, чтобы отправить почту пользователю.

Несколько как это:

class WelcomeMail < ActionMailer::Base  
    def welcome_mail(user) 
    @user = user 
    @url = 'http://example.com/login' 
    mail(to: @user.email, subject: 'Welcome to My Awesome Site') 
    end 
end 

Итак, ваш user_observer.rb становится:

class UserObserver < ActiveRecord::Observer 
    def after_save(user) 
     WelcomeMail.welcome_mail(user).deliver! 
    end 
end 
+0

Привет, у меня нет почтовой программы под названием user_observer.rb. У меня есть модель с таким именем (в нижнем регистре). Мой почтовый файл называется app/mailers/welcome_mail.rb – Mel

+0

@ user2860931 Пожалуйста, посмотрите мое редактирование. Я указал на проблемы и показал вам возможное решение. Попробуйте и дайте мне знать, если это сработает для вас! –

+0

Привет, я пробовал это предложение, но я все равно получаю эту ошибку: NameError (неинициализированный постоянный UserObserver :: Mailer): – Mel