在哪里放置用户访问控制?控制器还是型号?

时间:2010-12-19 23:33:24

标签: ruby-on-rails model-view-controller design-patterns

我知道我们应该避免在控制器中放置逻辑。那么实现用户访问控制之类的正确方法是什么。假设我有User,其中每个实例都有一个标志方法admin?,用于确定用户是否可以访问其他用户的信息。


选项1:将访问控制放在自定义模型

型号:

class User < ActiveRecord::Base
  def self.get_list(accessor)
    return [] unless accessor.admin?
    self.all
  end
end

控制器:

class UsersController < ApplicationController
  def index
    @users = User.get_list(current_user)
  end
end

current_user可能会在应用程序控制器中的某处定义。

选项2:在控制器中放置访问控制

型号:

class User < ActiveRecord::Base
end

控制器:

class UsersController < ApplicationController
  def index
    @users = current_user.admin? User.all : []
  end
end

还有一些外围的后果,例如测试的地方和实施方式。


我的直觉是两个选项中的第一个更可取,但我过去只使用过选项2。此外,似乎普遍接受(据我所知)实施全行动访问过滤器的做法是在控制器级别完成的,如:

class UsersController < ApplicationController
  before_filter :verify_logged_in
end

2 个答案:

答案 0 :(得分:3)

控制应用程序路由的任何逻辑都属于您的控制器。至于你的例子,第一个是优选的,但实际上并没有多少。

自相矛盾的框架很容易使我们几乎痴迷于以正确的方式做事。在你的例子中,在我看来,如果将少量逻辑放在你的控制器中就完全没问题了。如果你要抽象它,给它一个描述性的名称,更好地描述方法正在做什么,否则你只是让你的代码不必要地难以阅读。

答案 1 :(得分:0)

作为 rails菜鸟,我的第二个选项似乎更容易阅读和理解。我更喜欢如何读取控制器中的单行,看看你到底在做什么。

在第一个例子中,这个逻辑隐藏在其他地方(显然是模型,但我是一个新手记得!)并且看起来有点冗长(对于这个特定的例子)。

我不是故意建议让新孩子更容易保持好事,只是指出一个偏好。