Rails + CanCan + Полиморфная Ассоциация не работает должным образом - PullRequest
2 голосов
/ 31 января 2012

Я пытаюсь заставить канкан работать с полиморфной ассоциацией, я прочитал документы и вики и не могу заставить его работать ...

У меня есть следующие модели:

class User < ActiveRecord::Base
  has_many :areas, :as => :owner, :dependent => :destroy            
end 

class Account < ActiveRecord::Base  
  has_many :areas, :as => :owner, :dependent => :destroy
end

class Area < ActiveRecord::Base   
  belongs_to :owner, :polymorphic => true
end

и в контроллере:

class AreasController < ApplicationController  

  load_resource :user, :instance_name => :owner
  load_resource :account, :instance_name => :owner
  load_and_authorize_resource :area, :through => :owner

  before_filter :authorize_parent

  respond_to :html

  def authorize_parent
    authorize! :manage, @owner
  end    

  def index   
  end          

  def show
    @events = @area.events.page(params[:page]).per(5)
    respond_with @area
  end

  def new 
    respond_with @area
  end               

  def create                                
    @area = @owner.areas.new(params[:area])   
    if @area.save
      flash[:notice] = "Your new area has been created..."
    end  
    respond_with @area
  end

end      

и следующие способности:

  can :manage, Area, :owner => { :memberships => { :user => { :id => user.id } } } # Accounts through Membership     
  can :manage, Area, :owner => { :id => user.id } # User

действия new и create отлично работают как для user_areas, так и account_areas, но когда я пытаюсь перейти к индексу действия областей, я получаю следующую ошибку:

NameError in AreasController#index

uninitialized constant Owner

Есть мысли? большое спасибо

1 Ответ

2 голосов
/ 13 февраля 2012

Он считает, что ваш класс называется Owner, может быть, вы можете попробовать как:

load_resource :user, :instance_name => :owner, :class=>'User'
load_resource :account, :instance_name => :owner, :class=>'Account'
load_and_authorize_resource :area, :through => :owner

Если не работает, посмотрите, решает ли эта проблема вашу проблему: https://github.com/ryanb/cancan/issues/73

Исходя из заявки, если вы используете версию 1.3 или более позднюю, вы можете сделать следующее:

load_resource :user
load_resource :account
load_and_authorize_resource :area, :through => [:user, :account]

Но в этом случае ваш метод authorize_parent изменится следующим образом:

def authorize_parent
  authorize! :manage, (@user||@account)
end    

Для получения подробной документации см. Заголовок Polymorphic associations на: https://github.com/ryanb/cancan/wiki/Nested-Resources

Дайте мне знать, если у вас работает.Ура Энди;)

...