我试图根据角色和"帖子"控制器锁定一些控制器,无论他们是否分配了任何权限.这似乎有效,但我想知道是否有一个干净的方法来处理这个问题.这就是我在应用程序控制器中所拥有的,我称之为前置过滤器...
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
Run Code Online (Sandbox Code Playgroud)
提前致谢.
您不应该创建一个代码片段来检查控制器名称以在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
Run Code Online (Sandbox Code Playgroud)
现在将其添加为您需要的前置过滤器:
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
Run Code Online (Sandbox Code Playgroud)
因此ApplicationController定义了过滤器,但是它是否适用于其他控制器是否实际使用这些过滤器.像ApplicationController这样的超类应该永远不会根据其子类有条件地分支执行.选择何时使用提供的行为是您想要首先进行子类化的原因之一.
从代码可读性的角度来看,它也更加清晰.在查看UsersController时,很明显当你看到一个名为"require_something"之类的过滤器时会发生一些权限.根据您的方法,您无法通过查看用户控制器代码本身来判断这一点.
归档时间: |
|
查看次数: |
1302 次 |
最近记录: |