`

在Rails中的 Model中使用current_user

阅读更多
在Rails中的 Model(业务层)中使用current_user,关于这个话题我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


大家 认为哪一种方式更好呢? 我个人比较看好第二种。



相关链接:
http://clearcove.ca/blog/2008/08/recipe-make-request-environment-available-to-models-in-rails/#more-273

http://www.neeraj.name/blog/articles/755-using-current_user-in-model-and-other-places
分享到:
评论
4 楼 darkbaby123 2010-01-28  
个人觉得,原作者没有把current_user放到Model层是有道理的。所谓当前用户只是针对会话而言,放在Controller层正合适,而Model层只处理和模型相关的逻辑,它是可以独立存在的。这样也方便在console中调用,或者写单元测试。
所以为什么不直接传参呢?
3 楼 Hooopo 2009-12-25  
yangzhihuan 写道
窃以为,要在model中使用current_user的话,最好的办法是传递变量.

另外,我觉得可以尽量把跟user相关的方法写在User类中,在有需要使用到current_user的时候,直接current_user.method(),岂不是更好?

偶早就和他这么说过...他就是不信。。。
2 楼 yangzhihuan 2009-12-24  
窃以为,要在model中使用current_user的话,最好的办法是传递变量.

另外,我觉得可以尽量把跟user相关的方法写在User类中,在有需要使用到current_user的时候,直接current_user.method(),岂不是更好?
1 楼 Hooopo 2009-12-24  
都不好,还是别把current user放在model里好

相关推荐

    auth_boilerplate:使用 Rails 4 和 Bcrypt 进行样板认证

    在 ApplicationController 中用于current_user和authorize辅助方法。 用户在布局文件中注册、登录和注销的链接。 布局文件中的 Flash 消息支持。 安装Bcrypt提醒Rails 命令生成您的用户模型。 通过has_secure_...

    rails登陆注册

    在Rails中,我们通常使用`rails generate model`命令创建一个新的模型,例如: ```bash rails generate model User username:string email:string password_digest:string ``` 这里的`password_digest`字段用于...

    在不使用Devise的情况下在RubyonRails中实现API密钥.zip

    在Ruby on Rails框架中,开发API时通常会使用如Devise这样的身份验证库来处理用户认证。然而,有时我们可能需要自己实现API密钥的管理,以满足特定的需求或者避免引入额外的依赖。本教程将深入讲解如何在不使用...

    rails国际化

    通过`config.time_zone`配置时区,用户端可以通过`current_user.time_zone`获取并使用。 7. **动态切换语言**:在前端,可以通过用户选择的语言选项动态改变`I18n.locale`,从而实时更新整个应用的语言环境。 8. *...

    将用户头像添加到Devise的RailsActiveStorage示例_Ruby_H.zip

    本示例将详细解释如何将ActiveStorage集成到使用Devise的Rails应用中,以便用户可以上传和管理他们的个人头像。 首先,我们需要确保项目已经安装了Devise和ActiveStorage。在Gemfile中添加以下行: ```ruby gem '...

    用acts_as_rateable实现简单的打分功能

    一旦设置好,你就可以在应用中使用`acts_as_rateable`提供的方法了。例如,用户可以对一个帖子进行评分: ```ruby @post = Post.find(1) current_user.rate(@post, 4) # 4表示评分,可以是1到5的整数 ``` 同时,你...

    Ruby on Rails实现最基本的用户注册和登录功能的教程

    rails new user_login ``` ##### 2. 安装bcrypt gem `has_secure_password`特性需要依赖于bcrypt来对密码进行加密处理。因此,我们需要在项目的`Gemfile`中添加以下内容: ```ruby # Gemfile # Use ActiveModel has...

    投票:为Elixir中的Ecto模型实现类似跟随功能的投票。 受Ruby on Rails中Acts的Voable宝石启发

    这个功能在Ruby on Rails中可以通过`acts-as-votable`这样的gem来实现,现在我们将探讨如何在Elixir的Phoenix框架中用Ecto实现类似的功能。 首先,我们需要定义两个主要的Ecto模式:一个是表示可投票内容的模型...

    LeanCloudSDK封装LeanMotion.zip

    用更Ruby的写法来操作LeanCloud的数据,类Rails的ActiveRecord,增删查改。 安装说明 1、安装gem gem install lean_motion 2、创建项目 lean_motion create app-name 3、修改 app_delegate.rb设置LeanCloud的App...

    将复杂的SQL查询refactor成model形式

    如果需要添加更多查询条件,比如课程(Course)信息,我们可以修改`initialize`方法,接收课程参数,并在`call`方法中使用`where`添加条件: ```ruby class UserAssignmentsQuery def initialize(user, course) @...

    authentication_and_devise_546

    1. **模型(Model)**:Devise在你的应用中创建一个或多个模型(如User或Member),这些模型包含用于身份验证的属性,如email和encrypted_password。Devise还提供了许多便利的助手方法,如`current_user`和`...

Global site tag (gtag.js) - Google Analytics