我如何可以覆盖色器件宝石CURRENT_USER。 其实我需要为移动应用添加Web服务。
目前,设计是Web应用程序管理会话和“CURRENT_USER”。
现在,移动应用程序将发送USER_ID到服务器。 我需要重写当前用户喜欢这个
def current_user
if params[:user_id].blank?
current_user
else
User.find(params[:user_id])
end
end
我是否需要修改色器件创业板插件? 或者是其他东西 ?
详细,因为我在轨新请解释。
亲切的问候,
根据模块设计::控制器::助手 , current_user
(与所有其他色器件助手一起)添加到ApplicationController中,这意味着你可以用这种方式重写它:
# in application_controller.rb
alias_method :devise_current_user, :current_user
def current_user
if params[:user_id].blank?
devise_current_user
else
User.find(params[:user_id])
end
end
对方的回答暗示走样方法其实并不是最好的解决方案。 道格英语的评论是最好的解决办法:
# In ApplicationHelper
def devise_current_user
@devise_current_user ||= warden.authenticate(:scope => :user)
end
这里的原因:
假设你包括你的控制器在ApplicationHelper。 如果您需要在您的ApplicationHelper依靠devise_current_user,给出的控制器内部的别名解决的方法,你的运气了。
但上面的方法明确定义,你可以定义移动到助手和其他方法调用它,你仍然可以把它列入控制器。
这是有用的,例如,当你正在开发一个用户模拟解决方案,你需要显示视图两个不同的用户,一个是真正的管理员(devise_current_user)和其他的模拟用户(CURRENT_USER)。
假设我们可以信任我们的会话数据(这依赖于是否让用户输入有未经适当授权或没有),这可能工作作为关注:
module Concerns
module ControllerWithImpersonation
extend ActiveSupport::Concern
included do
helper_method :devise_current_user
end
def current_user
if session[:impersonated_user_id].blank?
devise_current_user
else
User.find(session[:impersonated_user_id])
end
end
def devise_current_user
@devise_current_user ||= warden.authenticate(:scope => :user)
end
end
end
我在一个项目中使用这个现在。
A小调的问题(在回答,抱歉)...我应该知道在设计或监狱长,使任何更改devise_current_user
以上过时?
凌波鹏的回答是伟大的,但可以提高一点,以确保只有管理员可以这样做:
你将还需要定义一个is_admin?
方法或is_admin
上的用户类属性。
您可能还需要使用比一个不同的密钥user_id
,所以它永远不会与正常参数冲突。
# to impersonate another user, e.g. for customer support
# only admins can do this..
#
alias_method :devise_current_user, :current_user
def current_user
if ! params[:user_id].blank? \
&& devise_current_user && devise_current_user.is_admin?
User.find(params[:user_id])
else
devise_current_user
end
end