【发布时间】:2011-05-28 00:16:39
【问题描述】:
我知道我们应该避免将逻辑放入控制器中。那么实现用户访问控制之类的正确方法是什么。假设我有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
【问题讨论】:
标签: ruby-on-rails model-view-controller design-patterns