我试图根据角色和"帖子"控制器锁定一些控制器,无论他们是否分配了任何权限.这似乎有效,但我想知道是否有一个干净的方法来处理这个问题.这就是我在应用程序控制器中所拥有的,我称之为前置过滤器...
if controller_name == 'users' || 'accounts' unless @current_user.master? || @current_user.power? render :template => "layouts/no_content" end elsif controller_name == 'posts' unless @current_user.permissions.count > 0 render :template => "layouts/no_content" end end
提前致谢.
您不应该创建一个代码片段来检查控制器名称以在application.rb中执行特定操作.您应该在过滤器之前仅在需要它们的控制器中定义它
在ApplicationController中创建2个方法:
private def require_master_or_power_user unless @current_user.master? || @current_user.power? render :template => "layouts/no_content" end end def require_some_permisions unless @current_user.permissions.count > 0 render :template => "layouts/no_content" end end
现在将其添加为您需要的前置过滤器:
class UsersController < ApplicationController before_filter :require_master_or_power_user ... end class AccountsController < ApplicationController before_filter :require_master_or_power_user ... end class PostsController < ApplicationController before_filter :require_some_permisions ... end
因此ApplicationController定义了过滤器,但是它是否适用于其他控制器是否实际使用这些过滤器.像ApplicationController这样的超类应该永远不会根据其子类有条件地分支执行.选择何时使用提供的行为是您想要首先进行子类化的原因之一.
从代码可读性的角度来看,它也更加清晰.在查看UsersController时,很明显当你看到一个名为"require_something"之类的过滤器时会发生一些权限.根据您的方法,您无法通过查看用户控制器代码本身来判断这一点.