2011-08-18 30 views
7

Tôi muốn sử dụng CanCan để xử lý các quyền của mình. Trang web của tôi có nhiều cấp độ quyền khác nhau và hầu hết trong số đó là nhận thức ngữ cảnh. Ví dụ: Dưới đây là các mối quan hệ trong 3 mô hình chính của tôi:Ủy quyền nhận thức ngữ cảnh bằng cách sử dụng CanCan

class User < ActiveRecord::Base 
    has_many :league_relations 
    has_many :leagues, :through => :league_relations 
end 

class League < ActiveRecord::Base 
    has_many :league_relations 
    has_many :users, :through => :league_relations 
end 

class LeagueRelation < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :league 
end 

Lưu ý, LeagueRelations là tài nguyên lồng nhau của Giải đấu. Những gì tôi muốn làm là cho phép người dùng sửa đổi giải đấu và đánh giá ủy quyền của từng người dùng dựa trên dữ liệu được lưu trữ trong league_relation. Sau đó tôi muốn người dùng sửa đổi quan hệ giải đấu, chỉ dựa trên dữ liệu được lưu trữ trong mô hình người dùng.

Để gọn gàng: về cơ bản tôi muốn LeagueRelations được sử dụng để cho phép các hành động của Liên đoàn và Người dùng được sử dụng để ủy quyền các hành động của LeagueRelations. tức là league_relation.owner = true để xóa một League, nhưng user.owner? phải đúng để xóa một LeagueRelation. Làm thế nào tôi có thể ủy quyền dựa trên các thuộc tính của league_relation khi bên trong bộ điều khiển giải đấu, và cho phép các hành động khác trong các bộ điều khiển khác trên các mô hình khác. Xin vui lòng để lại một bình luận nếu bạn cần làm rõ thêm.

Cảm ơn.

Trả lời

10

Ok, tôi đã giải quyết được sự cố. Trường hợp sử dụng của tôi được đề cập một thời gian ngắn vào đầu chương trình READC của CanCan và tôi đã bỏ lỡ nó. Bạn có thể định nghĩa các lớp Khả năng mới trong ứng dụng/mô hình/có tham số khác với current_user. Để thực hiện việc này, bạn hãy đặt những điều sau vào bộ điều khiển của mình:

def current_ability 
    if params[:controller] == 'leagues' 
    @current_ability = LeagueAbility.new(current_user_league_relation) 
    elsif params[:controller] == 'league_relations' 
    @current_ability = LeagueRelationAbility.new(current_user_league_relation) 
    else 
    @current_ability = Ability.new(current_user) 
    end 
end 

Bây giờ bạn có thể tạo league_ability.rb trong ứng dụng/mô hình /.

class LeagueAbility 
    include CanCan::Ability 

    def initialize(league_relation) 
    league_relation ||= LeagueRelation.new 

    if league_relation.owner? 
     can :manage, League, :id => league_relation.league_id 
    elsif league_relation.moderator? 
     can :manage, League, :id => league_relation.league_id 
     cannot [:delete, :destroy], League 
    else 
     can :read, League 
     can :create, League 
    end  
    end 
end 

Một điều cần lưu ý là điều này phụ thuộc vào bộ điều khiển ứng dụng của bạn gọi phương thức trong lớp con. Hy vọng rằng sẽ giúp!

Các vấn đề liên quan