Rails - 流量控制问题,还有更好的方法吗?

1 ruby ruby-on-rails

我试图根据角色和"帖子"控制器锁定一些控制器,无论他们是否分配了任何权限.这似乎有效,但我想知道是否有一个干净的方法来处理这个问题.这就是我在应用程序控制器中所拥有的,我称之为前置过滤器...

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)

提前致谢.

Ale*_*yne 7

您不应该创建一个代码片段来检查控制器名称以在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"之类的过滤器时会发生一些权限.根据您的方法,您无法通过查看用户控制器代码本身来判断这一点.