天天看點

在Rails中的 Model中使用current_user

[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]

繼續閱讀