我知道我们应该避免将逻辑放入 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/