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.
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