As vezes precisamos criar um formulário de contato que simplesmente envie a mensagem por email mas não mantenha o registro no sistema. Quando se usa Rails, o fluxo normal é após o formulário ser submetido, a informação é salva no banco porque usamos ActiveRecord.

Para que possamos submeter um formulário e não salvar no banco mas mesmo assim ter as facilidades que o AR fornece, iremos usar o ActiveAttr. Essa gem permite que tenhamos validações no nosso model e usemos o attr_accessible por exemplo.

Então vamos primeiramente criar nosso model e adicionar algumas validações.

#app/models/contact.rb
class Contact
  # Primeiro, vamos adicionar o ActiveAttr
  include ActiveAttr::Model

  # agora definimos os campos que queremos usar
  attribute :name
  attribute :email
  attribute :subject
  attribute :content

  # e da mesma forma que fazemos no AR, vamos dizer
  # quais atributos podem ser passados pelo form
  attr_accessible :name, :email, :subject, :content

  # também iremos adicionar algumas validações básicas
  validates_presence_of :name
  validates_presence_of :email
  validates_format_of :email,
    :with => /^[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}$/i
  validates_presence_of :subject
  validates_presence_of :content
end

Com o model definido, o resto é basicamente a mesma coisa que você faria com qualquer controller e views usando AR. Vamos criar o controller que irá pegar os dados submetidos e passar para o Mailer para serem enviados por email.

# app/controllers/contacts_controller.rb
class ContactsController < ApplicationController
  def new
    @contact = Contact.new
  end

  def create
    @contact = Contact.new(params[:contact])
    # a única diferença do método create padrão do rails,
    # é que iremos enviar por email e não chamar o método save
    ContactMailer.support_mail(@contact).deliver
    redirect_to root_path, notice: 'Your message was sent'
  end
end

Agora precisamos criar a view que irá conter nosso formulário.

#app/views/contacts/new.html.erb
# eu gosto de usar [simple_form](https://github.com/plataformatec/simple_form)
<%= simple_form_for @contact do |f| %>
    <%= f.error_notification %>

    <%= f.input :name %>
    <%= f.input :email %>
    <%= f.input :subject %>
    <%= f.input :content %>

    <%= f.submit %>
<% end %>

Estamos com nosso formulário praticamente pronto, precisamos apenas criar o mailer para enviar as informações de contato. Nada demais aqui, apenas um mailer comum.

#app/mailers/contact_mailer.rb
class ContactMailer < ActionMailer::Base
  default from: "[email protected]"

  def contact_mail(contact)
    @contact = contact
    mail(to: '[email protected]', subject: @contact.subject)
  end
end

A view do mailer também não tem nada demais, a mesma coisa que estamos acostumados a fazer.

#app/views/contact_mailer/contact_mailer.html.erb
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
  </head>
  <body>
    <h1>New menssage from: <%= @contact.name %></h1>

    <h2><%= @contact.subject %></h2>
    <p><%= @contact.content %></p>
  </body>
</html>

Com isso, temos um formulário de contato que envia a mensagem diretamente para o seu email de contato.