3

Cancanは、ユーザーがログインしているときは正常に機能しています。ただし、ユーザーが「ゲスト」の場合は、写真の親投稿に制限employees_onlyフラグが設定されている写真ではなく、一部の写真を表示できるようにしたいと思います。

問題はemployee_only、配列内の投稿に関連する写真がある場合@photos、CancanがスローすることCanCan::AccessDenied in PhotosController#indexです。しかしload_and_authorize_resource :photo, :through => :event、コントローラーでそれらの無許可のレコードをから排除するべきではありません@photosか?

ability.rb

class Ability
  include CanCan::Ability

  def initialize(user)  
    user ||= User.new # guest user (not logged in)

    if user.role? :admin
      can :manage, :all
    elsif user.role? :moderator
      can :read, :all
      can :manage, Post
      can :manage, Event
    elsif user.role? :employee
      can :read, :all
      can :create, Post
      can :update, Post, :user_id => user.id
      can :destroy, Post, :user_id => user.id
      can :update, User, :id => user.id
      can :create, Photo
      can :update, Photo, :id => user.id
      can :destroy, Photo, :id => user.id
    else
      can :read, :all
      cannot :read, Post, :employee_only => true
      cannot :read, Photo, :post => { :employee_only => true } ## <- problem?
    end
  end
end

event.rb:

class Event < ActiveRecord::Base
Event has_many :posts
Event has_many :photos, :through => :posts

post.rb

class Post < ActiveRecord::Base
  belongs_to :user
  belongs_to :event
  has_many :photos, :dependent => :destroy

photos_controller:

class PhotosController < ApplicationController
  load_and_authorize_resource :event                       ## <- problem?
  load_and_authorize_resource :photo, :through => :event   ## <- problem?

  def index
    # @event = Event.find(params[:event_id])
    # @photos = @event.photos.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @events }
    end
  end
  ...

user.rb#この問題のトラブルシューティングにこれが必要かどうかはわかりませんが、JIC:

class User < ActiveRecord::Base
  attr_protected :roles_mask
  has_many :posts
  has_many :photos, :through => :posts
  ...
4

1 に答える 1

0

まず、能力ファイルで削除します

cannot :read, Photo, :post => { :employee_only => true } ## <- problem?

投稿を制限しているので、それは必要ないと思います。

次に、コントローラーの変更で

load_and_authorize_resource :event                       ## <- problem?
load_and_authorize_resource :photo, :through => :event   ## <- problem?

load_and_authorize_resource :post
load_and_authorize_resource :photo, :through => :post

あなたがしようとしているのは、投稿を介して写真をロードすることだと思います-投稿はemployee_only = falseの投稿に制限されているため、暗黙的に写真を制限しています。次に、写真コントローラーで、写真の読み込みと承認に使用できるように、投稿を読み込む必要があります。cancan で起こるべきこと (私が思うに) は、posts.employee_only = false の場合、投稿と写真の間で内部結合が行われることです。

于 2012-07-21T23:49:14.310 に答える