acts_as_authenticatedの使い方 - その1

まずはプラグインをインストールする。プラグインはvendor/pluginにインストールされる。


$ ./script/plugin discover
$ ./script/plugin install acts_as_authenticated
script/generatorではvendor/pluginにインストールされた以下のジェネレータを起動できるようになっている。

Plugins: authenticated, authenticated_mailer
authenticatedジェネレータを使って認証用コードを生成するには以下のようにモデル名(user)とコントローラ名(account)名を指定する。

$ ./script/generate authenticated user account
exists app/models/
exists app/controllers/
exists app/helpers/
create app/views/account
exists test/functional/
exists test/unit/
create app/models/user.rb
create app/controllers/account_controller.rb
create lib/authenticated_system.rb
create lib/authenticated_test_helper.rb
create test/functional/account_controller_test.rb
create app/helpers/account_helper.rb
create test/unit/user_test.rb
create test/fixtures/users.yml
create app/views/account/index.rhtml
create app/views/account/login.rhtml
create app/views/account/signup.rhtml
create db/migrate
create db/migrate/001_create_users.rb
自動的にマイグレート用コードも生成されるので、データベーステーブルを生成しておく。
$ rake db:migrate
生成されるテーブル構造は以下の通り。

                                                                                                      • -
Table Create Table
                                                                                                      • -
users CREATE TABLE `users` (

`id` int(11) NOT NULL auto_increment,
`login` varchar(255) default NULL,
`email` varchar(255) default NULL,
`crypted_password` varchar(40) default NULL,
`salt` varchar(40) default NULL,
`created_at` datetime default NULL,
`updated_at` datetime default NULL,
`remember_token` varchar(255) default NULL,
`remember_token_expires_at` datetime default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

                                                                                                      • -

authenticatedジェネレータが生成したaccountコントローラにはindex, login, signup, logoutが含まれている。
indexメソッドを変更し、ログインしていない時にはログインフォームを表示するようにする。

  def index
  # redirect_to(:action => 'signup') unless logged_in? || User.count > 0
    unless User.count > 0
      redirect_to(:action => 'signup')
      return
    end
    redirect_to(:action => 'login') unless logged_in?
  end

もともと存在しているuserレコードが1つも存在していない時はsignupへリダイレクトするという処理は残しておく。(運用時の最初の一回しか呼ばれないのであまり意味はない)
app/views/account/index.rhtmlにあるポエムは削除し、代わりに現在のユーザのログインステートを表示する。

<% if logged_in? %>
  <p>You are logged in</p>
<% else %>
  <p>You are not logged in</p>
<% end %>