2016-01-13 71 views
0

在我的rails v4应用中,用户属于一个组。在Rails应用中限制某些用户的路由

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

每个组可以有很多项目,

class Group < ActiveRecord::Base 
    has_many :projects 
    has_many :users 
    ... 

每个项目可以有很多的实验,在一个一对多的关系。

在我的路线,我有:

resources :projects do 
    resources :experiments do 
     ... 
    end 
    end 

我希望做的是只允许用户访问项目和实验,如果该项目具有相同的GROUP_ID的用户(即如果用户进入项目中的项目ID参数#显示其组外的项目路径,它将不会显示)。有没有一种干净的方式来实现这一点,而不必在视图中进行多项检查?

回答

1

这是授权问题,因此,对于我来说,最好定义用户可以使用任何自动更新库查看的内容,而不是使用路由或类似内容。例如,因为您肯定会想知道是否应该在视图中显示给定组的链接,哪些组适用于当前用户等等。

看看cancancan例如:https://github.com/CanCanCommunity/cancancan

+0

这将帮助我的项目从这里出来。谢谢! –

1

看看构建基于组成员自定义的约束:

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

极其简单的例子(当然,你需要适合自己的项目设计):

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

然后在您的路线:

resources :projects, constraints: GroupConstraint.new do 
    resources :experiments do 
     ... 
    end 
end 
相关问题