3

我正在尝试添加filter_access_toattribute_check: true但我的模型 ,Assignment是嵌套的Project,我想检查当前用户是否已分配给项目,以便他/她可以更新分配(即所有分配,而不仅仅是特定的分配)该项目。

我有下一个权限:

has_permissions_on :assignment do |a|
    to :read
    if_attribute :user, is { user }
end

在我的控制器中:

filter_access_to :all, require: :manage, context: :assignment, attribute_check: true

问题是我无法访问索引页面,因为它找不到分配的 ID。

我的模型是:

class User < ActiveRecord::Base
    has_many :assignments
    has_many :projects, through: :assignments
end

class Project < ActiveRecord::Base
    has_many :assignments
    has_many :users, through: :assignments
end

class Assignment < ActiveRecord::Base
    belongs_to :user, inverse_of: :assignments
    belongs_to :project, inverse_of: :assignments
end
4

2 回答 2

3

除非您有非常特殊的使用需求,否则您filter_access_to可以改用filter_resource_access参见文档)并指定:nested_in选项。

filer_access_to只需使用以下(或类似)更改您的行:

filter_resource_access nested_in: :projects

如果您真的想继续使用filter_access_to,那么您需要创建一个与 Project 关联的 Assignment 实例,并将其分配@assignmentbefore_filter. 当您使用filter_resource_access.

于 2012-09-17T23:47:19.797 回答
0

这是对我有用的代码:

before_filter :set_assignment
    filter_access_to [:index,:create,:destroy], require: :manage, context: :assignment, attribute_check: true
....
def set_assignment
  @project ||= Project.find(params[:project_id])
  p = {project_id: @project.id}.merge(params[:assignment] || {})
  @assignment ||= (params[:id] ? Assignment.find(params[:id]) : Assignment.new(p))
end

不知道为什么filter_resource_access :nested_in => :project没有工作。它对 and 有效,index但对createand无效destroy

于 2012-09-19T19:16:27.537 回答