ハマり中

login_generator 使って動作の確認をしているのですが、ログインした状態で @session[:user] が nil のまんま、という状態になってしまっており、原因不明です。

README_LOGIN によると ココ見なさい、と書いてあるので今から見にイッてきます。(とほほほ

追記

@session['user'] で参照したらデキた。ナニーと言いつつ、login_generator で作成された controller の方を @session[:user] に修正したら @session[:user] で参照できた。'user' と :user って同じだと思っていたのですが違うの?

追記 2

えーと、バージョンですが

  • rails 1.1.4
  • login_generator 1.2.2

の模様。

ログインして自分のブクマが見れる、とゆーのは微妙にアレなので写経は略。はてなっぽいナニを実装できればな、と。明日から ip unreachable なんで Ajax アプリの実装をなぞってみたいんですが ...

追記 3

む。login_generator 入れてナニ、な記述がすっトンでますな。google notebook に下書きが保存されていた (しかも 2 つ) のでそのまま公開しちゃえ。(こらー

写経 (10分で作るRailsアプリ) その 3

login_generator って使ったコトあんだっけ違ったっけ、と思っていたら試用したのは、LoginEngine というプラグインだった。もしかすると、plugin よりは generator の方がマージは簡単なのかな、と思いつつも実際にマージな作業をしたコトないんで単純比較は無理ッス。(を

テキストとして使用している_最新 LL フレームワークエクスプローラ_には付録な記事としてツールカタログなナニがありまして、ソコに Login Generator なナニが紹介されている。

とりあえず login_generator 版を写経なんですが、現時点のバージョンを取っておいて上記のナニを試してみるのも良いかもな、と。
# Login Engine の方がナニ、と言われている方もいらっしゃる模様。
# これはマージのアレを比較してみたら良いかも。(ええ、暇人です

gem でインストールとの事。別途他の方法を模索な必要はあると思うがとりあえず。

# gem install login_generator --remote
Bulk updating Gem source index for: http://gems.rubyforge.org
Successfully installed login_generator-1.2.2
#

ハイ、入りました。とゆー事で動作検証ですね。

まずテーブル作成します。

mysql -u bmuser bookmark -p -h 192.168.0.1
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6 to server version: 5.0.20-Debian_1-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create table users (
    -> id int(11) not null auto_increment,
    -> login varchar(80) default null,
    -> password varchar(40) default null,
    -> primary key (id)
    -> ) ;
Query OK, 0 rows affected (0.64 sec)

mysql> \q
Bye
#

で、テーブル作成したら generator によってコードを作成、と。テキストに沿って、コントローラの名前は Account に。

$ ruby script/generate login Account
      create  lib/login_system.rb
      create  app/controllers/account_controller.rb
      create  test/functional/account_controller_test.rb
      create  app/helpers/account_helper.rb
      create  app/models/user.rb
      create  test/unit/user_test.rb
      create  test/fixtures/users.yml
      create  app/views/layouts/scaffold.rhtml
   identical  public/stylesheets/scaffold.css
      create  app/views/account
      create  app/views/account/welcome.rhtml
      create  app/views/account/login.rhtml
      create  app/views/account/logout.rhtml
      create  app/views/account/signup.rhtml
      create  README_LOGIN
$

ちなみにコントローラの名前を略したら User コントローラという名前になる、との事。

で、ユーザ認証をアプリケーション全体で有効にすべく、app/controllers/application.rb を以下の通りに修正。

app/controllers/application.rb

class ApplicationController < ActionController::Base
  include LoginSystem
  model :user
end

この状態でサインアップ/ログイン/ログアウトは可能との事だが、コントローラ単位でアクセスの制限が可能との事 (ログインしてないと見れない、なナニ)。制限をカケるには、コントローラ方面に以下のような宣言を追加すれば良いとの事。
おそらくは、アプリ全体に制限、なナニは app/controllers/application.rb に、だろうな、と。(別途検証必要)

app/controllers/item_controller.rb

class ItemController < ApplicationController

  before_filter :login_required

  def index
(以下略)

動作チェキ入れてみたトコロ、http://localhost:3000/item/ へのアクセスは http://localhost:3000/account/login へリダイレクトされた。登録しなきゃ見れない状態との事にて、まずは http://localhost:3000/account/signup にアクセス (本当は signup へのリンクが出てるとナニかも)。signup が済んだら http://localhost:3000/item/ 方面にリダイレクトされました。偉いね。

logout 後も http://localhost:3000/item/list へのアクセスは login 画面へのリダイレクトとなっております。結構お手軽ですね。

で、はてな風にログインユーザ ID を出力させてみよう、とトライしたトコ、例外が発生している模様 (色々インターネト様にお伺いを立てていると、この記事の写経って結構沢山の方々が手を染めていらっしゃる模様ですな。記事自体が昨年末なんで情報としては古いのか。とほほほ)。

順に見てみますね。まず、login#AccountController にて @session[:user] (って @session['user'] になってるな。古い所以とはこれか) に User.authenticate の戻りを設定しとりますな。
で、次。user.rb 見てみますと、定義はこんな感じ (一部のみ引用)

class User < ActiveRecord::Base

  def self.authenticate(login, pass)
    find_first(["login = ? AND password = ?", login, sha1(pass)])
  end  

む。 find_first 返却してるっつーコトは、ActiveRecord なオブジェクト (多分 User クラスのオブジェクト) で、テーブルのカラムにアクセスするには .カラム名で OK なはずなんであって、例外発生って別な理由クサいな。メセジは以下。

You have a nil object when you didn't expect it!
The error occured while evaluating nil.login

むー。@session[:user] が nil って意味クサい。

もひとつ
  • gem で login_generator を install
  • users table の作成
  • コード作成

$ ruby script/generate login Account
create lib/login_system.rb
create app/controllers/account_controller.rb
create test/functional/account_controller_test.rb
create app/helpers/account_helper.rb
create app/models/user.rb
create test/unit/user_test.rb
create test/fixtures/users.yml
create app/views/layouts/scaffold.rhtml
identical public/stylesheets/scaffold.css
create app/views/account
create app/views/account/welcome.rhtml
create app/views/account/login.rhtml
create app/views/account/logout.rhtml
create app/views/account/signup.rhtml
create README_LOGIN
$

  • 動作確認

app/controllers/application.rb

class ApplicationController < ActionController::Base
  include LoginSystem
  model :user
end

app/controllers/account_controller.rb (一部)

  def welcome
    redirect_to :action => "list", :controller => "item"
  end

ログイン後、一覧表示に遷移する事を確認。

  • 認証とアクセスの制限

item コントローラは認証済みでないとアクセスできない、状態の実装

app/controllers/item_controller.rb (一部)

class ItemController < ApplicationController
  before_filter :login_required

  def index
(以下略)

これでログアウトした状態で http://localhost:3000/item/list に接続すると、http://localhost:3000/account/login に強制的に遷移する。ログインすれば item/list に遷移する。

  • ログインユーザ情報の表示

とりあえず、アクセス制限はトル。で、app/view/item/list.rhtml に以下の変更を加える。

ようこそ
<%=
  if @session[:user]
    @session[:user].login
  else
    "ゲスト"
  end
%>
さん

<%= form_tag :action => "list" %>
キーワード:
<input name="keyword" value="<%=h @params[:keyword] %>"/>
(以下略)

うーん ...
ようこそゲストさん、としか出力されない。

ツッコミどころ満載なんですが、とりあえず公開しちゃえ。