繁体   English   中英

设计问题(Ruby On Rails)

[英]Design Question (Ruby On Rails)

在我的系统中有许多类型的用户(4),基于登录的用户,他们只能访问某些信息。

例如,我试图在我的客户端模型中执行类似的操作:

 class Client
     def self.allowed
        if current_user.is_a?(SuperAdmin)
          return self.all
        elsif current_user.is_a?(Client)
          return [current_user]
        elsif current_user.is_a?(ClientAdmin)
          return [current_user.client]
        end
      end
   end

问题是,似乎我的模型无法访问current_user帮助器方法。 (未定义的局部变量或方法`current_user'表示#)

我有两个问题:

  1. 我怎样才能解决这个问题
  2. 是否应该在模型中完成返回允许的客户端等逻辑?

使用您的方法,我将定义允许传入用户进行检查的方法,如下所示:

class Client
   def self.allowed(user)
      if user.is_a?(SuperAdmin)
        return self.all
      elsif user.is_a?(Client)
        return [user]
      elsif user.is_a?(ClientAdmin)
        return [user.client]
      end
    end
 end

然后,您的控制器可以根据正在执行的操作决定应该检查哪个用户(虽然这通常是current_user ,这将释放您的实现以与任何用户一起工作,因此如果您决定在以后添加依赖于该事实的功能你被保险了。

话虽这么说,你应该去授权库; 我个人非常喜欢CanCan 它允许您使用与此处提供的样式类似的样式在一个位置定义授权。 作者Ryan Bates 对使用CanCan进行精彩的截屏视频

1.我该如何解决这个问题

如果没有看到您尝试访问该方法的方法,我无法分辨,但您可能会在ApplicationController考虑以下内容:

before_filter :set_current_user

def set_current_user
  Client.current_user = current_user
end

这会在您的Client模型中提供current_user的副本。

2.应该在模型中完成诸如恢复允许的客户端之类的逻辑吗?

我使用过的大多数身份验证系统都将current_user (或等效函数)放在ApplicationController ,并提供了保护特定控制器操作不被未授权用户访问的方法。 毕竟,控制器应该决定哪些用户能够访问他们的操作,而不是模型。

一般来说,如果您尝试从模型中访问控制器的成员/方法,那么您做错了 - 这不是信息应该通过MVC应用程序传递的方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM