Wednesday, 28 November 2012

Guest user functionality in rails app

Hi,

In many requirements you may be asked to provide guest user functionality in application. Here are the simple steps to make that functionality simple.


rails g migration add_guest_to_users guest:boolean
rake db:migrate


index.html.erb
<p><%= button_to "Guest User!", users_path, method: :post %></p>



layouts/application.html.erb
Logged in as <strong><%= current_user.name %></strong>.
<% if current_user.guest? %>
  <%= link_to "Become a member", signup_path %>
<% else %>
  <%= link_to "Log Out", logout_path %>
<% end %>


user_controller.rb
def create
  @user = params[:user] ? User.new(params[:user]) : User.new_guest
  if @user.save
    current_user.move_to(@user) if current_user && current_user.guest?
    session[:user_id] = @user.id
    redirect_to root_url
  else
    render "new"
  end
end


models/user.rb
class User < ActiveRecord::Base
  has_many :tasks, dependent: :destroy

  attr_accessible :username, :email, :password, :password_confirmation

  validates_presence_of :username, :email, :password_digest, unless: :guest?
  validates_uniqueness_of :username, allow_blank: true
  validates_confirmation_of :password

  # override has_secure_password to customize validation until Rails 4.
  require 'bcrypt'
  attr_reader :password
  include ActiveModel::SecurePassword::InstanceMethodsOnActivation
 
  def self.new_guest
    new { |u| u.guest = true }
  end
 
  def name
    guest ? "Guest" : username
  end
 
  def move_to(user)
    tasks.update_all(user_id: user.id)
  end
end


lib/tasks/guests.rake
namespace :guests do
  desc "Remove guest accounts more than a week old."
  task :cleanup => :environment do
    User.where(guest: true).where("created_at < ?", 1.week.ago).destroy_all
  end
end


By applying above simple steps you can add guest user functionality in existing rails application easily .

Thank You,
Uma Mahesh.

No comments:

Post a Comment