在Rails应用程序中限制到某些用户的路由

时间:2016-01-13 16:39:13

标签: ruby-on-rails

在我的rails v4应用中,用户属于一个组。

build_pip_package

每个小组都可以有很多项目,

tensorflow/tools/pip_package/BUILD

每个项目都可以在一对多的关系中进行多次实验。

在我的路线中,我有:

class User < ActiveRecord::Base
  belongs_to :group
  ...

我想做的只是允许用户访问项目和实验,如果项目与用户具有相同的group_id(即,如果用户在项目中输入项目ID参数#show route for a project outside他们的小组,将不会显示)。是否有一种干净的方法来实现这一点而无需在视图中进行多项检查?

2 个答案:

答案 0 :(得分:2)

看一下基于组成员身份构建自定义约束:

http://guides.rubyonrails.org/routing.html#advanced-constraints

非常简单的示例(显然,您需要匹配您的项目设计):

// String.raw(callSite, ...substitutions)

function quux (strings, ...values) {
    strings[0] === "foo\n"
    strings[1] === "bar"
    strings.raw[0] === "foo\\n"
    strings.raw[1] === "bar"
    values[0] === 42
}

quux `foo\n${ 42 }bar`

String.raw `foo\n${ 42 }bar` === "foo\\n42bar"

然后在你的路线中:

class GroupConstraint
  def initialize
    @project = Project.find(params[:id])
    @user = current_user
  end
 
  def matches?(request)
    @user.groups.include?(@project.group)
  end
end

答案 1 :(得分:1)

这是授权问题,因此,对我而言,最好定义用户可以使用任何auhtorization库查看的内容,而不是使用路由或类似内容。例如,您肯定想知道如果您在视图中显示给定组的链接,哪些组可供当前用户使用等等。

cancancan为例:https://github.com/CanCanCommunity/cancancan