在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
分享到:
相关推荐
在 ApplicationController 中用于current_user和authorize辅助方法。 用户在布局文件中注册、登录和注销的链接。 布局文件中的 Flash 消息支持。 安装Bcrypt提醒Rails 命令生成您的用户模型。 通过has_secure_...
在Rails中,我们通常使用`rails generate model`命令创建一个新的模型,例如: ```bash rails generate model User username:string email:string password_digest:string ``` 这里的`password_digest`字段用于...
在Ruby on Rails框架中,开发API时通常会使用如Devise这样的身份验证库来处理用户认证。然而,有时我们可能需要自己实现API密钥的管理,以满足特定的需求或者避免引入额外的依赖。本教程将深入讲解如何在不使用...
通过`config.time_zone`配置时区,用户端可以通过`current_user.time_zone`获取并使用。 7. **动态切换语言**:在前端,可以通过用户选择的语言选项动态改变`I18n.locale`,从而实时更新整个应用的语言环境。 8. *...
本示例将详细解释如何将ActiveStorage集成到使用Devise的Rails应用中,以便用户可以上传和管理他们的个人头像。 首先,我们需要确保项目已经安装了Devise和ActiveStorage。在Gemfile中添加以下行: ```ruby gem '...
一旦设置好,你就可以在应用中使用`acts_as_rateable`提供的方法了。例如,用户可以对一个帖子进行评分: ```ruby @post = Post.find(1) current_user.rate(@post, 4) # 4表示评分,可以是1到5的整数 ``` 同时,你...
rails new user_login ``` ##### 2. 安装bcrypt gem `has_secure_password`特性需要依赖于bcrypt来对密码进行加密处理。因此,我们需要在项目的`Gemfile`中添加以下内容: ```ruby # Gemfile # Use ActiveModel has...
这个功能在Ruby on Rails中可以通过`acts-as-votable`这样的gem来实现,现在我们将探讨如何在Elixir的Phoenix框架中用Ecto实现类似的功能。 首先,我们需要定义两个主要的Ecto模式:一个是表示可投票内容的模型...
用更Ruby的写法来操作LeanCloud的数据,类Rails的ActiveRecord,增删查改。 安装说明 1、安装gem gem install lean_motion 2、创建项目 lean_motion create app-name 3、修改 app_delegate.rb设置LeanCloud的App...
如果需要添加更多查询条件,比如课程(Course)信息,我们可以修改`initialize`方法,接收课程参数,并在`call`方法中使用`where`添加条件: ```ruby class UserAssignmentsQuery def initialize(user, course) @...
1. **模型(Model)**:Devise在你的应用中创建一个或多个模型(如User或Member),这些模型包含用于身份验证的属性,如email和encrypted_password。Devise还提供了许多便利的助手方法,如`current_user`和`...