file "app/models/user_session.rb" do
%{
class UserSession < Authlogic::Session::Base
logout_on_timeout true # default is false
end
}.strip
end
file "app/models/user.rb" do
%{
class User < ActiveRecord::Base
acts_as_authentic do |c|
c.logged_in_timeout = 10.minutes # default is 10.minutes
end
end
}.strip
end
file "app/controllers/user_sessions_controller.rb" do
%{
class UserSessionsController < ApplicationController
before_filter :require_no_user, :only => [:new, :create]
before_filter :require_user, :only => :destroy
def new
@user_session = UserSession.new
end
def create
@user_session = UserSession.new(params[:user_session])
if @user_session.save
flash[:notice] = "Login successful!"
redirect_back_or_default account_url
else
render :action => :new
end
end
def destroy
current_user_session.destroy
flash[:notice] = "Logout successful!"
redirect_back_or_default new_user_session_url
end
end
}.strip
end
file "app/views/user_sessions/new.html.erb" do
%{
Login
<% form_for @user_session, :url => user_session_path do |f| %>
<%= f.error_messages %>
<%= f.label :email %>
<%= f.text_field :email %>
<%= f.label :password %>
<%= f.password_field :password %>
<%= f.check_box :remember_me %><%= f.label :remember_me %>
<%= f.submit "Login" %>
<% end %>
}.strip
end
# Setup some routes
route 'map.resource :user_session'
route 'map.resource :account, :controller => "users"'
route 'map.resources :users'
route 'map.register "/register", :controller => "users", :action => "new"'
route 'map.login "/login", :controller => "user_sessions", :action => "new"'
route 'map.logout "/logout", :controller => "user_sessions", :action => "destroy"'
file "app/controllers/application_controller.rb" do
%{
# Filters added to this controller apply to all controllers in the application.
# Likewise, all the methods added will be available for all controllers.
class ApplicationController < ActionController::Base
helper :all
helper_method :current_user_session, :current_user
filter_parameter_logging :password, :password_confirmation
private
def current_user_session
return @current_user_session if defined?(@current_user_session)
@current_user_session = UserSession.find
end
def current_user
return @current_user if defined?(@current_user)
@current_user = current_user_session && current_user_session.record
end
def require_user
unless current_user
store_location
flash[:notice] = "You must be logged in to access this page"
redirect_to new_user_session_url
return false
end
end
def require_no_user
if current_user
store_location
flash[:notice] = "You must be logged out to access this page"
redirect_to account_url
return false
end
end
def store_location
session[:return_to] = request.request_uri
end
def redirect_back_or_default(default)
redirect_to(session[:return_to] || default)
session[:return_to] = nil
end
end
}.strip
end
file "app/controllers/users_controller.rb" do
%{
class UsersController < ApplicationController
before_filter :require_no_user, :only => [:new, :create]
before_filter :require_user, :only => [:show, :edit, :update]
def new
@user = User.new
end
def create
@user = User.new(params[:user])
if @user.save
flash[:notice] = "Account registered!"
redirect_back_or_default account_url
else
render :action => :new
end
end
def show
@user = @current_user
end
def edit
@user = @current_user
end
def update
@user = @current_user # makes our views "cleaner" and more consistent
if @user.update_attributes(params[:user])
flash[:notice] = "Account updated!"
redirect_to account_url
else
render :action => :edit
end
end
end
}.strip
end
file "app/views/users/_form.html.erb" do
%{
<%= form.label :email %>
<%= form.text_field :email %>
<%= form.label :password, form.object.new_record? ? nil : "Change password" %>
<%= form.password_field :password %>
<%= form.label :password_confirmation %>
<%= form.password_field :password_confirmation %>
}.strip
end
file "app/views/users/edit.html.erb" do
%{
Edit My Account
<% form_for @user, :url => account_path do |f| %>
<%= f.error_messages %>
<%= render :partial => "form", :object => f %>
<%= f.submit "Update" %>
<% end %>
<%= link_to "My Profile", account_path %>
}.strip
end
file "app/views/users/new.html.erb" do
%{
Register
<% form_for @user, :url => account_path do |f| %>
<%= f.error_messages %>
<%= render :partial => "form", :object => f %>
<%= f.submit "Register" %>
<% end %>
}.strip
end
file "app/views/users/show.html.erb" do
%{
Email:
<%=h @user.email %>
Login count:
<%=h @user.login_count %>
Last request at:
<%=h @user.last_request_at %>
Last login at:
<%=h @user.last_login_at %>
Current login at:
<%=h @user.current_login_at %>
Last login ip:
<%=h @user.last_login_ip %>
Current login ip:
<%=h @user.current_login_ip %>
<%= link_to 'Edit', edit_account_path %>
}.strip
end
# can't rely on internal rails migration generation, so we do it this way
#Dir.chdir("script") #for ruby 1.9.2 08/07/2009 . no need for ruby1.9.1p129
#run "./generate migration beet_authlogic_create_user" # for ruby 1.9.2 08/07/2009. no need for ruby1.9.1p129
run "script/generate migration beet_authlogic_create_user"
#now open it
#Dir.chdir("..") # for ruby 1.9.2 08/07/2009. no need for ruby1.9.1p129
file(Dir.glob('db/migrate/*beet_authlogic_create_user*').first) do
%{
class BeetAuthlogicCreateUser < ActiveRecord::Migration
def self.up
unless table_exists?(:users)
create_table :users do |t|
t.string :email, :null => false # optional, you can use login instead, or both
t.string :crypted_password, :null => false # optional, see below
t.string :password_salt, :null => false # optional, but highly recommended
t.string :persistence_token, :null => false # required
t.string :single_access_token, :null => false # optional, see Authlogic::Session::Params
t.string :perishable_token, :null => false # optional, see Authlogic::Session::Perishability
# Magic columns, just like ActiveRecord's created_at and updated_at. These are automatically maintained by Authlogic if they are present.
t.integer :login_count, :null => false, :default => 0 # optional, see Authlogic::Session::MagicColumns
t.integer :failed_login_count, :null => false, :default => 0 # optional, see Authlogic::Session::MagicColumns
t.datetime :last_request_at # optional, see Authlogic::Session::MagicColumns
t.datetime :current_login_at # optional, see Authlogic::Session::MagicColumns
t.datetime :last_login_at # optional, see Authlogic::Session::MagicColumns
t.string :current_login_ip # optional, see Authlogic::Session::MagicColumns
t.string :last_login_ip # optional, see Authlogic::Session::MagicColumns
end
end
end
def self.down
drop_table :users
end
end
}.strip
end
gem 'authlogic', :version => '~> 2.0.0'
if yes?("Install using sudo?")
rake "gems:install", :sudo => true
else
rake "gems:install"
end
rake "db:create:all"
rake "db:migrate"