Канкан не загружает вложенные ресурсы, как я ожидаю - PullRequest
3 голосов
/ 31 августа 2011

Cancan работает нормально, когда пользователь вошел в систему. Но когда пользователь является "гостем", я бы хотел, чтобы они могли видеть некоторые фотографии, но не те, для которых в родительском сообщении фотографии установлено ограничение employees_only..

Проблема в том, что если в массиве @photos есть какая-либо фотография, связанная с постом employee_only, тогда Cancan выдаст CanCan::AccessDenied in PhotosController#index.Но не должен load_and_authorize_resource :photo, :through => :event в контроллере удалить эти несанкционированные записи из @photos?

способность. 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
  ...

1 Ответ

0 голосов
/ 22 июля 2012

Во-первых, в вашем файле способностей удалите

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, вы неявно ограничиваете количество фотографий.,Затем в контроллере ваших фотографий вам нужно загрузить сообщение, чтобы его можно было использовать для загрузки и авторизации фотографий.То, что должно произойти в канкане (я думаю), это внутреннее соединение между постами и фотографиями, где posts.employee_only = false.

...