【问题标题】:Rails Observers & MailerRails 观察者和邮件程序
【发布时间】:2015-11-04 11:48:43
【问题描述】:

我正在尝试弄清楚如何向新用户发送欢迎电子邮件。

我昨天问了这个问题 https://stackoverflow.com/questions/31934734/rails-mailer-no-method-error?noredirect=1#comment51781688_31934734 它投了反对票(我不知道如何找出原因)并且无法获得任何建设性的帮助。

我已经找到了 rails-observer gem 并且正在尝试另一种方法。

我的问题是,当我推送它并尝试它时,我收到一条错误消息:NameError (uninitialized constant UserObserver::Mailer)。

我对该错误的理解是,没有与观察者姓名匹配的模型。我肯定有一个 user.rb 模型,我的应用程序中还有一个名为 Mailer 的文件。

我有以下设置:

在我的模型文件夹中,我有 user_observer.rb:

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

用户/注册控制器:

   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: "...@....com", 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 的视图文件夹有关的问题。我不知道在这个问题的上下文中这意味着什么,因为我没有尝试从设计发送邮件。

【问题讨论】:

    标签: ruby-on-rails devise actionmailer observers


    【解决方案1】:

    在您发布的代码中,您有这个: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
    

    【讨论】:

    • 嗨,我没有名为 user_observer.rb 的邮件程序。我有一个同名的模型(小写)。我的邮件文件名为 app/mailers/welcome_mail.rb
    • @user2860931 请看我的编辑。我已经指出了问题并向您展示了可能的解决方案。试一试,让我知道这是否适合你!
    • 您好,我尝试了这个建议,但仍然收到此错误:NameError (uninitialized constant UserObserver::Mailer):
    • @user2860931 更改代码后您是否重新启动了服务器?因为您已经将Mailer.welcome_mail(user).deliver! 更改为WelcomeMail.welcome_mail(user).deliver!,所以您不应该收到相同的错误
    • 我确实重启了服务器。我也推到heroku并现场试用。在这两种情况下,我都会遇到同样的错误。
    猜你喜欢
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2016-08-26
    相关资源
    最近更新 更多