Rails tutorial: Simple blog subscription feature in Rails

Here is a simple Rails MVC tutorial guide. This step by step tutorial will help you to configure routes, generate model, controller and view (i.e. MVC). It will also teach you how to send email using ActionMailer in Rails.

Before start this you have to setup new rails application with MySQL database. My previous post help you. Check this link:

Setting MySQL database to Rails Application

First of all generate a model called Subscriber with following command:

rails g model Subscriber email:string

Which will generate Subscriber model (app/model) directory and a migration file in db/migrations directory.

Then run following command

rake db:migrate

Note: rake is now moved to rails. so you can also run following command: rails db:migrate

Now we have to add validation to check for empty and correct email format of email field to our Subscriber model.

class Subscriber < ActiveRecord::Base
   validates :email, presence: true
   validates :email, uniqueness: true
   validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :on => :create
end

Now time to configure routes. We can configure routes in routes.rb as following.

Rails.application.routes.draw do
   resources :subscribers, only: [:create]
end

Which will generate following routes:

rake routes | grep subscribers
HTTP Verb Path         Controller#Action  Named Helper
POST      /subscribers subscribers#create subscribers_path

Now its time to create form partial which we can we use in any pages. For this create a partial file to app/views/shared/_subscription_form.html.erb . Which includes following codebase.

<div class="recent">
  <h3>Subscribe Blog</h3>
   <%= form_for :subscriber, url: subscribers_path do |f| %>
     <span><label for="email">Email</label></span>
     <%= f.text_field :email, class: 'form-control' %>
     <%= f.submit %>
   <%end%>
</div>

Now we can render this partial file from any views as following:

<%= render 'shared/subscription_form' %>

At this situation we have model, routes and view for subscription form is ready. Not its time to write controller action to create subscriber record.

class SubscribersController < ApplicationController

  def create
    subscriber = Subscriber.new(subscriber_params)
    if subscriber.valid?
      subscriber.save
      flash[:success] = "You have subscribed successfully"
    else
      flash[:error] = "Problem in subscription: #{subscriber.errors.full_messages.join(', ')}"
    end
    redirect_to :back
  end

  private
  def subscriber_params
    params.require(:subscriber).permit(:email)
  end
end

To display the proper error and success message put following line of codes in any suitable view files. Here you can use this on subscription_form partial.

<% [:success, :error].each do |key| %>
  <% if flash[key] %>
    <div class="<%= key %>" id="flash">
      <%= flash[key] %>
    </div>
   <% end %>
<% end %>

Now its time to see result.

For Rails MVC please check following links from RailsGuide:

Feel free to add comment if you face any problem.

3Shares

Leave a Reply

Your email address will not be published. Required fields are marked *

Enter Captcha Here : *

Reload Image