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.