LoginEngine + UserStamp 成功その1?

気持ち悪いんだけど、一応動いた。でもどうして動いているのか分からない。

class ApplicationController < ActionController::Base
  
  include LoginEngine
  helper :user
  model :user

  before_filter :login_required, :userstamp
  
  protected
  
  def userstamp
    User.current_user = User.find(session[:user].id) unless session[:user].nil?
  end  
  
  User.class_eval do
    cattr_accessor :current_user
  end
end

Userにクラス属性current_userを追加するのはApplicationControllerでやっちゃった。フィルタもここに書いてあるからまあ、いいかなと。で、これで動くはず、とか思ってたんだけどダメ。

ActiveRecord::AssociationTypeMismatch (User expected, got String):
    /path/to/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.3/lib/active_record/associations/association_proxy.rb:134:in `raise_on_type_mismatch'
    /path/to/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.3/lib/active_record/associations/belongs_to_association.rb:22:in `replace'
    /path/to/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.3/lib/active_record/associations.rb:850:in `created_by='
    /path/to/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.3/lib/active_record/associations.rb:844:in `created_by='
    /path/to/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.3/lib/active_record/base.rb:1510:in `send'
    /path/to/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.3/lib/active_record/base.rb:1510:in `attributes='
    /path/to/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.3/lib/active_record/base.rb:1509:in `each'
    /path/to/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.3/lib/active_record/base.rb:1509:in `attributes='
    /path/to/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.3/lib/active_record/base.rb:1354:in `initialize_without_callbacks'
    /path/to/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.3/lib/active_record/callbacks.rb:236:in `initialize'
    /path/to/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.3/lib/active_record/associations/has_many_association.rb:14:in `new'
    /path/to/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.3/lib/active_record/associations/has_many_association.rb:14:in `build'
    /app/controllers/book_title_has_many_books.rb:31:in `prepare_book_title_books_variables'
    /path/to/ruby/lib/ruby/gems/1.8/gems/actionpack-1.12.3/lib/action_controller/filters.rb:399:in `send'
    /path/to/ruby/lib/ruby/gems/1.8/gems/actionpack-1.12.3/lib/action_controller/filters.rb:399:in `call_filters'
    /path/to/ruby/lib/ruby/gems/1.8/gems/actionpack-1.12.3/lib/action_controller/filters.rb:394:in `each'
    /path/to/ruby/lib/ruby/gems/1.8/gems/actionpack-1.12.3/lib/action_controller/filters.rb:394:in `call_filters'
    /path/to/ruby/lib/ruby/gems/1.8/gems/actionpack-1.12.3/lib/action_controller/filters.rb:383:in `before_action'

って例外が発生。User expected, got String って、まじでー?文字列で設定しているところなんてないんですけどー。

で、setterの引数を見てみようと思って以下のように書いたら、期待通りに動いた。えー、なんでー?

class Book < ActiveRecord::Base
  
  belongs_to :created_by, :class_name => "User", :foreign_key => "created_by"
  belongs_to :updated_by, :class_name => "User", :foreign_key => "updated_by"
  
  def created_by=( user )
    super
  end
  
  def updated_by=( user )
    super
  end
end

Userstampって使われてないのか?多分、http://wiki.rubyonrails.com/rails/pages/Howto+Add+created_by+and+updated_by を元に作られていると思うんだけど、微妙に違うんだよね。