当覆盖色器件宝石CURRENT_USER helper方法(Where to override cu

2019-06-24 00:20发布

我如何可以覆盖色器件宝石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

我是否需要修改色器件创业板插件? 或者是其他东西 ?
详细,因为我在轨新请解释。

亲切的问候,

Answer 1:

根据模块设计::控制器::助手 , 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


Answer 2:

对方的回答暗示走样方法其实并不是最好的解决方案。 道格英语的评论是最好的解决办法:

# In ApplicationHelper
def devise_current_user
   @devise_current_user ||= warden.authenticate(:scope => :user)
end

这里的原因:

假设你包括你的控制器在ApplicationHelper。 如果您需要在您的ApplicationHelper依靠devise_current_user,给出的控制器内部的别名解决的方法,你的运气了。

但上面的方法明确定义,你可以定义移动到助手和其他方法调用它,你仍然可以把它列入控制器。

这是有用的,例如,当你正在开发一个用户模拟解决方案,你需要显示视图两个不同的用户,一个是真正的管理员(devise_current_user)和其他的模拟用户(CURRENT_USER)。



Answer 3:

假设我们可以信任我们的会话数据(这依赖于是否让用户输入有未经适当授权或没有),这可能工作作为关注:

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以上过时?



Answer 4:

凌波鹏的回答是伟大的,但可以提高一点,以确保只有管理员可以这样做:

你将还需要定义一个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


文章来源: Where to override current_user helper method of devise gem