2 Stimmen

Rails + CanCan + Polymorphe Assoziation funktioniert nicht wie erwartet

Ich versuche, cancan mit einer polymorphen Assoziation zu arbeiten, ich habe durch die Dokumente und Wiki gelesen und bin nicht in der Lage, es zu arbeiten...

Ich habe die folgenden Modelle:

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

und im Controller:

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      

und die folgenden Fähigkeiten:

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

Die Aktionen "Neu" und "Erstellen" funktionieren sowohl für "user_areas" als auch für "account_areas", aber wenn ich versuche, die Aktion "index" für "areas" aufzurufen, erhalte ich den folgenden Fehler:

NameError in AreasController#index

uninitialized constant Owner

Irgendwelche Ideen? Vielen Dank

2voto

dombesz Punkte 7867

Es berücksichtigt, dass Ihre Klasse den Namen Owner können Sie es vielleicht so versuchen:

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

Wenn das nicht funktioniert, prüfen Sie, ob Ihr Problem damit gelöst ist: https://github.com/ryanb/cancan/issues/73

Wenn Sie die Version 1.3 oder eine neuere Version verwenden, können Sie wie folgt vorgehen:

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

Aber in diesem Fall ist Ihr authorize_parent Methode ändert sich auf diese Weise:

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

Eine ausführliche Dokumentation finden Sie unter dem Titel Polymorphic associations an: https://github.com/ryanb/cancan/wiki/Nested-Resources

Lassen Sie mich wissen, ob das für Sie funktioniert. Prost Andy ;)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X