ruby-on-rails - 在哪里放置用户访问控制? Controller 还是模型?

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

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


选项 1:将访问控制置于自定义模型中

型号:

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

Controller :

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

current_user 可能会在应用程序 Controller 中的某个位置定义。

选项 2:将访问控制放入 Controller

型号:

class User < ActiveRecord::Base
end

Controller :

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

还有一些外围后果,例如测试的去向以及如何实现。


我的直觉是这两个选项中的第一个更好,但我过去只使用过选项 2。另外,似乎普遍接受的(据我所知)放置操作范围访问过滤器的做法是在 Controller 级别完成的,如下所示:

class UsersController < ApplicationController
  before_filter :verify_logged_in
end

最佳答案

任何控制应用程序路由的逻辑都属于您的 Controller 。至于你的例子,第一个是更好的,但实际上没有太多内容。

固执己见的框架很容易让我们几乎痴迷于以一种被认为正确的方式做事。在我看来,在你的例子中,如此少量的逻辑完全可以留在你的 Controller 中。如果您要对其进行抽象,请为其指定一个描述性名称,以更好地描述该方法正在执行的操作,否则您只会使代码变得不必要地难以阅读。

关于ruby-on-rails - 在哪里放置用户访问控制? Controller 还是模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4485763/

相关文章:

javascript - sinatra javascript 调用

ruby-on-rails - 在给定 URL 的情况下,替代 Apache 中的 X-sendfile 发送文件?

html - 背景图像 :url not working for amazon s3 image

ruby-on-rails - 在下拉列表中的树层次结构中显示类别/子类别

.net - ASP.NET MVC Web 应用程序中忽略了 AssemblyInfo 版本控制?

javascript - 如何在一个 View 中使用多个 ember 数据模型

c# - 如何从列表/数组中删除对象属性?

使用 Node 的Javascript继承

php - Kohana - 你把 AJAX 脚本放在哪里?

sql - 创建 Sql 查询的设计模式