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のインスタンスを作成し、それをの@assignmentインスタンス変数に割り当てる必要がありますbefore_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うまくいかなかったのか分かりません。それはうまくいきましたが、そうではありindexませんでした。createdestroy

于 2012-09-19T19:16:27.537 に答える