ログイン機能に対応したアプリケーションにカスタマイズ

Login Engineをインストールし、ログインの制限を行うことが可能になった。しかし、まだsoftwarebook2側のビューやデータベースは、ユーザー別の管理に対応していない...。softwarebook2とLogin Enginの連携を深めてみる。

カスタマイズの準備

Login Engine側のコードも若干修正が必要になるので、まずはその準備から。
softwarebook2/vender/plugins/login_engine/app/以下のファイル構成を、softwarebook2/app以下にコピーした。Login Engineの修正が必要な場合は、softwarebook2/app以下にコピーしたファイルを修正するようにする。このようにしておくと、Login Engineに限らず、Enginesプラグイン形式のものは、アプリケーション直下のappフォルダに定義されているメソッドを優先して実行する仕組みになっているようだ。*1本来は修正したいファイルだけコピーしておけば良いのだが、何を修正するか予想がつかないので、とりあえず全部コピー。あとで不要なファイルは削除する予定。

ログイン状態を示すメニューバーを追加

  • 今回は、softwarebook2に接続するためには、必ずログインが必要な仕様にした。
  • ユーザー名、Logout、Change passwordをメニューとして表示することにした。
views/layouts/softwares.rhtmlへの追記
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>Softwares: <%= controller.action_name %></title>
  <%= stylesheet_link_tag 'scaffold' %>
</head>
<body>
<% store_location %>......(1)

<%= render :partial=>"common/notice" if flash[:notice] -%>
<%= render :partial=>"common/error"  if flash[:error] -%>

<% for name in [:notice, :warning, :message] %>......(2)
  <%= "<p style=\"color: green\">#{flash[name]}</p>" if flash[name] %>
<% end %>

<div class="login">......(3)
  <%= link_to "#{current_user.lastname} #{current_user.firstname}", ......(4)
        :controller => 'user', :action => 'edit' %> |
  <%= link_to 'Logout', :controller => 'user', :action => 'logout' %> |
  <%= link_to 'Change password', :controller => 'user', :action => 'change_password' %>
</div>

<%= @content_for_layout %>

</body>
</html>
  1. store_locationを実行しておけば、その時のURLを保存する。ログインした時に保存したURLへ戻ることが出来る。
  2. Login Engineからのメッセージを表示する。(flash[:notice]がダブっているが、READMEのお手本コードのままにした。jacaffoldでflash[:notice]を表示した後、クリアされるので二重に表示されることは無いかな...。)
  3. div class="loginで、ログインメニューのブロックを定義した。このあとスタイルシートを定義することで、上下に破線を引くようにするため。
  4. link_toでLogin Engineのそれぞれのアクションへ、リンクを設定した。(ログイン者の名前をクリックすると、editアクションにリンクしたのは、こんな機能もあるということで覚えておくために。即削除も出来てしまうので、このままは良くないですね。)
public/stylesheets/scaffold.cssへの追記
div.login {
  padding: 2px;
  padding-bottom: 2px;
  border-top: 1px #444 dashed;
  border-bottom: 1px #444 dashed;
  text-align: right;
  font-size: small;
}
app/controllers/user_controller.rbの修正
class UserController < ApplicationController
  model   :user

  # Override this function in your own application to define a custom home action.
  def home
    if user?
      @fullname = "#{current_user.firstname} #{current_user.lastname}"
    else
      @fullname = "Not logged in..."
    end # this is a bit of a hack since the home action is used to verify user
        # keys, where noone is logged in. We should probably create a unique
        # 'validate_key' action instead.
    redirect_to :controller => 'softwares', :action => 'list'......(1)
  end
...(途中省略)...
  def logout
    session[:user] = nil
    # redirect_to :action => 'login'......(2)
  end
...(途中省略)...
  1. homeページ*2は、一覧表示のページを指定した。
  2. コメント行にして無効にすることで、一度ログアウトのページを表示するようにした。

*1:もちろん、直接pluginsの中のファイルを修正してしまっても大丈夫だと思う。でも、アプリケーション直下のappフォルダにコピーして修正すれば、削除すればいつでも元の状態に戻せる安心感がある。修正内容がはっきりするというのも良い。

*2:store_locationで保存されたURLが無い場合に表示されるログイン後のデフォルトのページ