Rails 上的邮件表格后的电子邮件通知(给用户)

Email notification (to user) after mail form on Rails

我是 Rails 的新手,我想在我的应用程序中添加一个 "subscribe" 功能。

每当有人订阅我的网站时,我确实设法收到通知(通过电子邮件)。我现在要做的是向用户发送一条通知,表示感谢。

我有:

/models/contact.rb

class Contact < MailForm::Base
  attribute :name
  attribute :email,     :validate => /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i
  attribute :message
  attribute :nickname,  :captcha  => true
  def headers
    {
      :subject => "New Subscription:",
      :to => "email@example.com",
      :from => "email@example.com"
    }
  end
end

/controllers/contacts_controller.rb

class ContactsController < ApplicationController
  def create
      @contact = Contact.new(params[:contact])
      @contact.request = request
      if @contact.deliver
        redirect_to(:back)
      else
        #TODO fail notification
        redirect_to(:back)
      end
  end
end

我尝试了什么:

我的问题是我没有用户模型,也不需要用户模型,因为此应用上没有存储空间。

如果我可以建议您从 ApplicationRecord 生成联系人模型并存储所有订阅您网站的人。然后您可以使用 ActiveJob 发送它们 谢谢通知。然后您还可以将通知添加到您的电子邮件中,以便在有人申请您的网站时收到通知。

以下是一些更改:

bin/rails g model Contact name:string email:string message:text is_sent:boolean

请注意,我添加了一个布尔值字段以指示消息已发送,但您可以保留它。

因此,我没有使用 model.contact 并继承自 MailForm::Base,而是创建了一个联系人模型,它将您的联系人存储到数据库中。我认为 ti 是一个很好的做法,因为您以后可以参考这些用户并可能从他们创建用户帐户或做其他有用的事情。

在您的控制器中,当您保存联系人记录时,您可以使用 ActiveJob 启动电子邮件发送或使用默认 Mailer 发送电子邮件。所以你的控制器里会有这样的东西

def create
  @contact = Contact.create(contact_params)
  if @contact.persisted?
    ContactMailer.say_thank_you(@contact).deliver_now
    ContactMailer.notify_webmaster(@contact).deliver_now
    # do the success redirect...
  else
    # do the failed redirect...handle error etc
  end

所以您首先要将记录保存到数据库,检查是否已保存,然后使用不同的电子邮件模板通知用户和网站管理员。要生成我在示例 say_thank_you 和 notify_webmaster 中使用的操作电子邮件方法,请参阅入门指南。

http://guides.rubyonrails.org/action_mailer_basics.html

由于您是 rails 的新手,我假设您熟悉创建迁移和允许参数 contact_params...params.require(:contact).permit(:name .... - 您可以使用默认脚手架并检查控制器内部代码生成的代码。

在我上面的示例中,我使用 is_sent 布尔值 属性,默认情况下我将其设置为 false。然后,一旦 ActionMailer 发送电子邮件,我就会更新此字段或稍后重试。只是为了知道哪些人收到了电子邮件,但这是可选的。

希望对您有所帮助。