Ruby on rails 设计问题(RubyonRails)

Ruby on rails 设计问题(RubyonRails),ruby-on-rails,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

在我的系统中有许多类型的用户(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

问题是,我的模型似乎无法访问当前的用户助手方法。(未定义的局部变量或#的“当前用户”方法)

我有两个问题:

  • 我怎样才能解决这个问题
  • 是否应该在模型中执行诸如返回允许的客户机之类的逻辑
  • 一,。我怎样才能解决这个问题

    我不知道不知道你是如何访问这个方法的,但是你可以在下面的代码>应用程序控制器< /代码>中考虑如下:< /P>

    before_filter :set_current_user
    
    def set_current_user
      Client.current_user = current_user
    end
    
    这将在
    客户机
    模型中提供当前用户的副本

    二,。是否应该在模型中执行诸如返回允许的客户机之类的逻辑

    我使用的大多数身份验证系统都将
    当前用户
    (或等效功能)放在
    应用程序控制器
    中,并提供了防止未经授权用户访问特定控制器操作的方法。毕竟,应该由控制器决定哪些用户可以访问他们的操作,而不是模型


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

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

    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
    
    然后,您的控制器可以根据正在执行的操作决定应该检查哪个用户(虽然这通常是
    当前用户
    ,但这将使您的实现能够与任何用户一起工作,因此,如果您决定添加功能,这取决于以后的事实,您将被介绍)


    这就是说,您应该在授权库中进行访问;我个人真的很喜欢。它允许您在一个地方定义授权,使用类似于您在这里展示的样式。作者Ryan Bates有一个错误。

    你能粘贴错误吗?您不应该使用“return”,只需要传递rails能够理解的应该返回的内容。只是一个提示。未定义的局部变量或方法“current_user”#