[b]在Rails中的 Model(業務層)中使用current_user[/b],關于這個話題我google了一下,看到了有兩種方式:
第一種就是為某一個Model加一個類變量current_user,然後在控制層(Controller)中加一個前置過濾器,來設定Model的current_user類變量。
代碼如下:
在Model中
class User < ActiveRecord::Base
cattr_accessor :current_user
#...
end
在控制器中:
class ApplicationController < ActionController::Base
include AuthenticatedSystem
before_filter :set_current_user
protected
def set_current_user
User.current_user = current_user # current_user方法已經在lib中寫好了
end
end
第二種比較特别\trick,是線上程中加一個變量,代碼如下:
在ApplicationController中
class ApplicationController < ActionController::Base
before_filter :set_request_environment
private
# stores parameters for current request
def set_request_environment
User.current = current_user # current_user is set by restful_authentication
# You would also set the time zone for Rails time zone support here:
# Time.zone = Person.current.time_zone
end
在Model中:
class User < ActiveRecord::Base
#-----------------------------------------------------------------------------------------------------
# CLASS METHODS
#-----------------------------------------------------------------------------------------------------
def self.current
Thread.current[:user]
end
def self.current=(user)
raise(ArgumentError,
"Invalid user. Expected an object of class 'User', got #{user.inspect}") unless user.is_a?(User)
Thread.current[:user] = user
end
end
大家 認為哪一種方式更好呢? :) 我個人比較看好第二種。
相關連結:
[url]http://clearcove.ca/blog/2008/08/recipe-make-request-environment-available-to-models-in-rails/#more-273[/url]
[url]http://www.neeraj.name/blog/articles/755-using-current_user-in-model-and-other-places[/url]