0

我是 Rails 新手,我想在我的应用程序上添加“订阅”功能。

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

我有的:

/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

我尝试了什么:

  • 使用 ActionMailer::Base 类发送电子邮件,但我无法从表单中检索 params[:contact][:email],因此无法通过电子邮件发送回复
  • 使用mailform发送多封电子邮件,但我没有做到

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

4

1 回答 1

0

如果我可以建议您从 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 发送电子邮件,我就会更新此字段或稍后重试。只是想知道哪些人收到了电子邮件,但这是可选的。

希望能帮助到你。

于 2016-06-16T18:34:49.330 回答