Login Engineのインストールとテスト
さて、ここから本格的な開発に入りますが、まず、このシステムはユーザごとに違う情報を表示することになるので、まずユーザ管理が必要になります。RailsにはLogin Engineという高機能かつ柔軟なプラグインがありますので、これを使うことにしました。
また、そのインストールですぐにデータベースを使いますので、migrationという機能を使って管理することにします。
参考にしたページは以下の通りです。
- pylori*style wiki - LoginEngineを使ってみる
- Download in Rails Engines
- pylori*style wiki - MigrationによるDB管理
Login Engineのインストールは、"Download in Rails Engines"というページを参考に、subversionを使った方法を試してみることにしました。
$ cd coreserve $ svn propset svn:externals "engines http://svn.rails-engines.org/plugins/engines" vendor/plugins $ svn propset svn:externals "login_engine http://svn.rails-engines.org/plugins/login_engine" vendor/plugins $ svn update
セットアップは、下記の内容をconfig/environment.rbに追加すればいいようです。
module LoginEngine config :salt, "my-salt" config :email_from, "(メールアドレス)" config :admin_email, "(メールアドレス)" config :app_name, "CoReserve" config :use_email_notification, false config :confirm_account, false end Engines.start :login
configの最後の2行は、メールによるユーザの確認確認をバイパスする為に必要になります。
ここでひとつ問題が起きました。generate等のスクリプトが動作しないのですが、原因はどうもlogin_engineの一部のソースがロードされないようです。いろいろ試行錯誤して、下記のようにロードパスにプラグインのディレクトリを追加することで解決しました。
これは、login_engine側の問題のようなので、当面、この状態で様子を見て、時間がある時にもう一度、再現テストをした上で開発元に報告しようと思います(情報求む)。
(下記の内容をconfig/environment.rbの先頭に追加)
$: << "vendor/plugins/login_engine/lib/login_engine/"
ここで、migrate用のスキーマの雛形を作成します。
$ ruby script/generate migration InitialSchema
とりあえずは、LoginEngine用のテーブルしか使わないので、vendor/plugins/login_engine/db/migrate/001_initial_schema.rbの内容を、db/migrate/001_initial_schema.rbにコピーします。
後程、Userテーブルに項目(クライアントとカウンセラーを区別するフラグ等)を追加すると思うので、コピーして使うことにしました。
これで、次のコマンドを実行すると、開発用のデータベースに、001_initial_schema.rbの内容に相当するテーブルが作成されます。
$ rake migrate
以下、本来migrateの使用法としては、データベースのバージョンごとに別ソースでスキーマを追加していくようですが、下記のコマンドを打つと、初期化した上で再作成するようなので、当分は、これで001_initial_schema.rbを修正していく方法で行なおうと思います。
$ rake migrate VERSION=0 ;rake migrate --trace
そして、app/controllers/application.rbを変更します。
# (app/controllers/application.rb) require 'login_engine' class ApplicationController < ActionController::Base include LoginEngine helper :user model :user end
そして、TestLoginというコントローラを作成して、このLoginEngineの機能をテストすることにします。
$ ruby script/generate controller -f TestLogin index
before_filterで、 :login_requiredというメソッドを呼ぶと自動的にログインを要求するようになるようです。
secretというメソッドを追加して、ゲストにはここを見せないようにしてみます。
# app/controllers/test_login_controller.rb class TestLoginController < ApplicationController before_filter :login_required, :only=>[:secret] def index end def secret render_text 'secret' end end
生成されたapp/views/test_login/index.rhtmlを以下のように修正して、LoginEngineの機能をテストしてみます。
<h1>TestLogin#index</h1> <% if current_user %> <p>Hello, <%= current_user.login %></p> <% else %> <p>Hello, guest </p> <% end %> <ul> <li><%= link_to "to secret page", :action=>'secret' %> <li><%= link_to 'logout', :controller => 'user', :action => 'logout' %> </ul>
以下のようなテストを行ないました。
- http://localhost:3000/test_login/にアクセス(Hello, guestと表示される)
- "to secret page"をクリック
- 自動的に/user/loginにリダイレクトされログインページが表示される
- "Register for an account"をクリック
- Singupページが表示されるので、入力してSingup(ユーザ登録)
- ログインページの戻るのでログイン
- 自動的にtest_login/secretにリダイレクトされ"secret"という文字が表示される
- 再度/test_login/にアクセス(Hello, xxxx(ユーザ名)と表示される)
- "to secret page"をクリックして再確認
- 再度/test_login/にアクセスして"logout"をクリック
- 2に戻る
indexのページはゲストにも見えて、secretのページはログインしないと見ることができないことが確認できました。
vendor/plugins/login_engine/lib/login_engine/の下の、authenticated_system.rbとauthenticated_user.rbのソースを見ることで、これの機能の概略はわかりそうです。