Authlogic 2.0.11

Authlogic Example App - Tutorial on how to create this app and easily setup Authlogic

Ruby ruby 1.8.6 (2008-08-11 patchlevel 287) [i386-mswin32]
Ruby on Rails 2.3.2
Authlogic 2.0.11

インストール

gem install authlogic

config/environment.rb

config.gem "authlogic"

セッションUserSessionの作成

ruby script/generate session user_session

app/models/user_session.rb

class UserSession < Authlogic::Session::Base
end

Userの作成

ruby script/generate model user login:string crypted_password:string password_salt:string persistence_token:string

app/models/user.rb

class User < ActiveRecord::Base
  acts_as_authentic
end

UserSessionsControllerの作成

ruby script/generate controller user_sessions

app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  helper :all
  protect_from_forgery

  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

app/controllers/user_sessions_controller.rb

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

app/views/user_sessions/new.html.erb

<h1>Login</h1>
<% form_for @user_session, :url => user_session_path do |f| %>
  <%= f.error_messages %>
  <%= f.label :login %><br />
  <%= f.text_field :login %><br />
  <br />
  <%= f.label :password %><br />
  <%= f.password_field :password %><br />
  <br />
  <%= f.submit "Login" %>
<% end %>

config/routes.rb

map.resource :user_session
map.root :controller => "user_sessions", :action => "new"

UsersControllerの作成

ruby script/generate controller users

app/controllers/users_controller.rb

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

app/views/users/_form.html.erb

<%= form.label :login %><br />
<%= form.text_field :login %><br />
<br />
<%= form.label :password, form.object.new_record? ? nil : "Change password" %><br />
<%= form.password_field :password %><br />
<br />
<%= form.label :password_confirmation %><br />
<%= form.password_field :password_confirmation %><br />

app/views/users/edit.html.erb

<h1>Edit My Account</h1>
<% form_for @user, :url => account_path do |f| %>
  <%= f.error_messages %>
  <%= render :partial => "form", :object => f %>
  <%= f.submit "Update" %>
<% end %>
<br />
<%= link_to "My Profile", account_path %>

app/views/users/new.html.erb

<h1>Register</h1>
<% form_for @user, :url => account_path do |f| %>
  <%= f.error_messages %>
  <%= render :partial => "form", :object => f %>
  <%= f.submit "Register" %>
<% end %>

app/views/users/show.html.erb

<p>
  <b>Login:</b>
  <%=h @user.login %>
</p>
<%= link_to 'Edit', edit_account_path %>

config/routes.rb

map.resource :account, :controller => "users"
map.resources :users