在不创建 model/controller 和使用数据库的情况下发送确认电子邮件?

Sending a confirmation email without creating a model/controller and use of a db?

我创建了一个单页登录站点,其中包含一个简单的等待列表表单,该表单将信息转储到 google 文档中(暂时尝试保持低技术含量,因为应用程序将构建在顶部这也是)。

我正在尝试向提交等待名单电子邮件地址的人发送一封确认电子邮件。我可以在不创建 model/controller 和使用数据库的情况下将电子邮件地址传递给邮寄者吗?

我之前通过创建 model/controller(见下面的代码)和使用数据库(postgreSQL / Heroku)来完成此操作,但对于这样一个简单的任务来说它看起来很麻烦。

这是我过去的设置,希望摆脱 model/controller 并将电子邮件地址(w/ .downcase 转换)直接传递给邮件程序。

models/waitlist.rb

class WaitList < ActiveRecord::Base
 before_save {self.email = email.downcase}
 attr_accessible :email

 validates :email, :presence => true, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i }

end

controllers/waitlist_controller.rb

class WaitlistsController < ApplicationController
 def create
  @waitlist = Waitlist.new(params[:waitlist])

  if @waitlist.save
   # Tell the ProspectMailer to send an email to us
   WaitlistMailer.waitlist_email(@waitlist).deliver
  end

 end

 private
end

mailer/waitlist.rb

class Waitlist < ActionMailer::Base
 default from: "hello@domain.com"

 def waitlist_email(waitlist)
  @waitlist = waitlist
  mail( :to => @waitlist.email,
:subject => 'Thanks for signing up!' )
 end
end

views/waitlist/waitlist_email.html.erb

Email text (possibly HTML) for the body of the email sent via the mailer

感谢您的帮助!

您的控制器应该告诉邮件程序发送电子邮件。

在您的控制器 create 操作中,为什么不直接将 email 参数传递给您的邮件程序?

app/controllers/wait_lists_controller.rb

class WaitListsController < ApplicationController
  def create
    send_wait_list_email(params[:wait_list][:email])
  end

  private

  def send_wait_list_email(email)
    WaitListMailer.wait_list_email(email).deliver
  end
end

app/mailers/wait_list_mailer.rb

class WaitListMailer < ActionMailer::Base
  def wait_list_email(email)
    mail(to: email, subject: "Thanks for signing up!")
  end
end

app/views/wait_lists/new.html.erb

<%= form_for(:wait_list, url: wait_lists_path) do |f| %>
  <%= f.text_field :email, placeholder: "Email" %>
  <%= f.submit "Join" %>
<% end %>

如果您想对电子邮件进行验证,我建议保留您的 WaitList 模型并包括 ActiveModel::Model — 并非所有模型都必须继承自 ActiveRecord::Base,仅当他们需要它。

app/models/wait_list.rb

class WaitList
  include ActiveModel::Model
  attr_reader :email

  def initialize(email)
    @email = email
    post_initialize
  end

  validates(
    :email, 
    presence: true, 
    format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i }
  )

  private

  def post_initialize
    if email
      email.downcase!
    end
  end
end

app/controllers/wait_lists_controller.rb

class WaitListsController < ApplicationController
  def new
    @wait_list = WaitList.new
  end

  def create
    @wait_list = WaitList.new(wait_list_params)
    if @wait_list.valid?
      send_wait_list_email(@wait_list)
      # redirect somewhere
    else
      render :new
    end
  end

  private

  def send_wait_list_email(wait_list)
    WaitListMailer.wait_list_email(wait_list).deliver
  end

  def wait_list_params
    params.require(:wait_list).permit(:email)
  end
end

app/views/wait_lists/new.html.erb

<%= form_for(@wait_list) do |f| %>
  <%= f.text_field :email, placeholder: "Email" %>
  <%= f.submit "Join" %>
<% end %>

希望对您有所帮助。

http://edgeguides.rubyonrails.org/action_mailer_basics.html#calling-the-mailer

http://api.rubyonrails.org/classes/ActiveModel/Model.html