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 を元に作られていると思うんだけど、微妙に違うんだよね。