A form I had to make to quickly start capturing leads
Creating a form to collect leads in a Ruby on Rails application is a common task and can be worthwhile. It'll give you :
- Full Control over the data collected and how it's stored.
- Customization for your form and the entire lead collection process to match your brand and requirements.
- Data Ownership. With third-party services your data is stored on their servers.
- No Additional Costs:
Plus it's quite easy! You can do this in your Rails application by following the steps below. We'll be adding a lead collection form in our homepage :
1. Generate a Leads model
rails generate model Lead email:string unsubscribed_at:datetime
rails db:migrate
💡 By default, every new lead won't have an unsubscribed_at
date. That field can be populated later when you need to unsubscribe a lead from your comms.
Now let's take a moment to add a minimal validation on the email field and a simple class method that checks any time we want if a user is still subscribed :
# lead.rb
class Lead < ApplicationRecord
validates :email, presence: true, uniqueness: true
def unsubscribed?
unsubscribed_at.present?
end
end
2. Create a controller for the lead form
rails generate controller Leads create --no-helper --no-assets --no-controller-specs --no-view-specs
It should look like this :
class LeadsController < ApplicationController
def create
@lead = Lead.new(lead_params)
if @lead.save
redirect_to root_path, notice: "💌 Thanks for subscribing! We'll keep you informed."
else
redirect_to root_path, notice: "Oops something went wrong!"
end
end
private
def lead_params
params.require(:lead).permit(:email)
end
end
3. Set up routes
Add a route for your leads form:
# config/routes.rb
resources :leads, only: [:new, :create]
4. Insert your form in your desired page
# app/views/pages/home.html.erb
<%= form_for(@lead) do |form| %>
<%= form.label :email %>
<%= form.email_field :email %>
<%= form.submit 'Submit' %>
<% end %>
Because I'm inserting it in my homepage, I need to make @lead
accessible to the PagesController, like so :
class PagesController < ApplicationController
def index
@lead = Lead.new
end
end
And voilà! You now have a functional form that can bring leads straight to your database and you can access the active ones with Lead.where(unsubscribed_at: nil)