Formulário de contato sem banco de dados e envio de email em Ruby on Rails
Criação de uma simples app com formulário de contato sem banco de dados e envio de email em Ruby on Rails
Vamos criar uma simples aplicação que vou chamar de contato ou o nome que preferir.
rails new contato -d mysql
Entramos na pasta da aplicação gerada pelo Rails 4+.
cd contato/
Dentro da pasta vamos nos tornar sudo pra quem usa Linux ou Mac.
sudo su
Agora vamos criar o controler Home com apenas duas actions index e contato.
rails generate controller home index contato
Criaremos um model Contato sem migration só com a finalidade de validação.
rails generate model Contato --migration=false
Abrimos o model Contato e vamos fazer as alterações abaixo.
#app/models/contato.rb
class Contato
include ActiveModel::Model
attr_accessor :nome, :email, :cidade, :estado, :telefone, :assunto, :mensagem
validates_presence_of :nome, :email, :cidade, :estado, :telefone, :assunto, :mensagem
validates_format_of :email, :with => /\A[^@]+@([^@\.]+\.)+[^@\.]+\z/
end
Em versões anteriores do Rails para usar o ActiveModel você tinha que fazer algo como isso para o mesmo resultado.
class Contato
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
extend ActiveModel::Translation
attr_accessor :nome, :email, :cidade, :estado, :telefone, :assunto, :mensagem
validates_presence_of :nome, :email, :cidade, :estado, :telefone, :assunto, :mensagem
validates_format_of :email, :with => /\A[^@]+@([^@\.]+\.)+[^@\.]+\z/
def persisted?
false
end
end
Vamos editar a view contato.
# app/views/home/contato.html.erb
<h1>Home#contato</h1>
<p>Find me in app/views/home/contato.html.erb</p>
<div class="row">
<div class="formulario col-md-6">
<h3><%= t('.titulo') %></h3>
<p><%= t('.descricao') %>.</p>
<div class="formulario_container">
<%= form_for(@contato, url: {action: "send_contato"}) do |f| %>
<% if @contato.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@contato.errors.count, "error") %> <%= t 'general.form_error' %></h2>
<ul>
<% @contato.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<fieldset>
<div class="form-group">
<%= f.label :nome, t('.form.nome'), class: "form_label" %><br />
<%= f.text_field :nome, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :email, t('.form.email'), class: "form_label" %><br />
<%= f.text_field :email, class: "form-control" %>
</div>
<div class="row">
<div class="col-md-9">
<%= f.label :cidade, t('.form.cidade'), class: "form_label" %><br />
<%= f.text_field :cidade, class: "form-control" %>
</div>
<div class="col-md-3">
<%= f.label :estado, t('.form.estado'), class: "form_label" %><br />
<% estados = [['Escolha', ''],['AC', 'AC'], ['AL', 'AL'], ['AM', 'AM'], ['AP', 'AP'], ['BA', 'BA'], ['CE', 'CE'], ['DF', 'DF'], ['ES', 'ES'], ['GO', 'GO'], ['MA', 'MA'], ['MG', 'MG'], ['MS', 'MS'], ['MT', 'MT'], ['PA', 'PA'], ['PB', 'PB'], ['PE', 'PE'], ['PI', 'PI'], ['PR', 'PR'], ['RJ', 'RJ'], ['RN', 'RN'], ['RO', 'RO'], ['RR', 'RR'], ['RS', 'RS'], ['SC', 'SC'], ['SE', 'SE'],['SP', 'SP'], ['TO', 'TO']]%>
<%= f.select(:estado, estados, {}, {class: "form-control"}) %>
</div>
</div>
<br />
<div class="form-group">
<%= f.label :telefone, t('.form.telefone'), class: "form_label" %><br />
<%= f.text_field :telefone, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :assunto, t('.form.assunto'), class: "form_label" %><br />
<%= f.text_field :assunto, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :mensagem, t('.form.mensagem'), class: "form_label" %><br />
<%= f.text_area :mensagem, cols: 31, rows: 5, class: "form-control" %>
</div>
<div class="form-group">
<%= f.submit t('.form.submit'), class: "btn btn-primary"%>
<%= f.submit t('.form.reset'), :type => "reset" , class: "btn btn-default"%>
</div>
</fieldset>
<% end %>
</div>
</div>
<div class="col-md-6">
<div class="info_contato">
<h3>Informações de Contatos</h3>
<br />
<p><strong>Localização</strong>: Fortaleza Ceará Brasil</p>
<p><strong>Telefones</strong>: +55 85 0000 0000<br />
+55 85 0000 0000 </p>
<p><strong>Email</strong>: <a href="mailto:[email protected]">[email protected]</a><br />
<strong>Website</strong>: <a href="http://www.gilcierweb.com.br">http://www.gilcierweb.com.br</a></p>
<hr />
</div>
</div>
</div>
Agora iremos criar um mailer que vai ficar responsável pelo envio do e-mails.
rails generate mailer ContatoMailer
Vamos abrir e editar o arquivo mailer gerado pelo rails.
#app/mailers/contato_mailer.rb
class ContatoMailer < ActionMailer::Base
# default from: "[email protected]"
default to: "[email protected]"
def new_message(message)
@contato = message
mail(from: @contato.email, subject: "Mensagem de contato CMS-Rails - GilcierWeb") do |format|
format.html { render 'contato_email' }
format.text { render 'contato_email' }
end
end
end
Criaremos outra action no controller Home chamada send_contato.
#app/controller/home_controller.rb
def send_contato
end
No controller Home editamos as action contato e send_contato para que fiquem assim.
#app/controller/home_controller.rb
def contato
@contato = Contato.new
end
# POST /send_contatos
def send_contato
@contato = Contato.new(contato_params)
if @contato.valid?
ContatoMailer.new_message(@contato).deliver
redirect_to(contato_path, notice: 'Mensagem enviada com sucesso!' )
else
flash[:error] = 'Erro ao enviar email'
render :contato
end
end
Ainda no home criaremos mais uma função seguindo o Strong Parameters do rails 4+
private
def contato_params
params.require(:contato).permit(:nome, :email, :cidade, :estado, :telefone, :assunto, :mensagem)
end
Finalizamos com o controller home agora iremos editar o arquivo rotas do rails.
#/config/routes.rb
Rails.application.routes.draw do
#Rotas para frontend
get '/', to: 'home#index'
get 'contato', to: 'home#contato'
post 'send_contato', to: 'home#send_contato'
# You can have the root of your site routed with "root"
root 'home#index'
end
Criamos as rotas que iremos usar agora temos que editar o arquivo de template do e-mail.
#/app/views/contato_mailer/contato_email.html.erb
<!DOCTYPE html>
<html>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
</head>
<body>
<h1>Mensagem de contato CMS-Rails - GilcierWeb - <%= @contato.nome %></h1>
<hr />
<p>Nome: <%= @contato.nome %><br />
Email: <%= @contato.email %><br />
Cidade: <%= @contato.cidade %><br />
Estado: <%= @contato.estado %><br />
Telefone: <%= @contato.telefone %><br />
Assunto: <%= @contato.assunto %><br />
Mensagem: <%= @contato.mensagem %><br />
</p>
<footer class="text-center">
<hr />
<p>
Copyright © GilcierWeb Rails - <%= Time.new.year %> - <a href="http://gilcierweb.com.br" target="_blank">gilcierweb.com.br</a>
<p>
</footer>
</body>
</html>
E criaremos o template somente texto.
#/app/views/contato_mailer/contato_email.text.erb
Mensagem de contato CMS-Rails - GilcierWeb - <%[email protected] %>
Nome: <%= @contato.nome %>
Email: <%= @contato.email %>
Cidade: <%= @contato.cidade %>
Estado: <%= @contato.estado %>
Telefone: <%= @contato.telefone %>
Aassunto': <%= @contato.assunto %>
Mensagem: <%= @contato.mensagem %>
Copyright © GilcierWeb Rails - <%= Time.new.year %> - http://gilcierweb.com.br
Finalizamos o formulário de contato com envio de e-mail agora é só testar espero ter ajudado alguém, para ver em uso acesse https://cmsrails.herokuapp.com/ e o Github pesquise sobre o assunto citado nesse humilde tutorial.
Links referências:
http://www.rubyonrails.com.br/
http://guides.rubyonrails.org/
http://guides.rubyonrails.org/action_mailer_basics.html
http://guides.rubyonrails.org/layouts_and_rendering.html
http://guides.rubyonrails.org/routing.html
http://www.caelum.com.br/apostila-ruby-on-rails/
http://vimeo.com/guateonrails/videos
https://www.youtube.com/channel/UCsXm26tIJAmh3MfaZi9Vr7g/videos