我知道我们应该避免在控制器中放置逻辑。那么实现用户访问控制之类的正确方法是什么。假设我有User
,其中每个实例都有一个标志方法admin?
,用于确定用户是否可以访问其他用户的信息。
型号:
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
可能会在应用程序控制器中的某处定义。
型号:
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
答案 0 :(得分:3)
控制应用程序路由的任何逻辑都属于您的控制器。至于你的例子,第一个是优选的,但实际上并没有多少。
自相矛盾的框架很容易使我们几乎痴迷于以正确的方式做事。在你的例子中,在我看来,如果将少量逻辑放在你的控制器中就完全没问题了。如果你要抽象它,给它一个描述性的名称,更好地描述方法正在做什么,否则你只是让你的代码不必要地难以阅读。
答案 1 :(得分:0)
作为 rails菜鸟,我的第二个选项似乎更容易阅读和理解。我更喜欢如何读取控制器中的单行,看看你到底在做什么。
在第一个例子中,这个逻辑隐藏在其他地方(显然是模型,但我是一个新手记得!)并且看起来有点冗长(对于这个特定的例子)。
我不是故意建议让新孩子更容易保持好事,只是指出一个偏好。