2012-06-18 34 views

Trả lời

1

Mô hình người dùng hiện hành được thông qua vào Ability#initialize, vì vậy bạn chỉ có thể kiểm tra các lớp học:

class Ability 
    include CanCan::Ability 

    def initialize(model) 
    case model 
    when Admin 
     can :manage, :all 
    when User 
     can :create, Comment 
     can :read, :all 
    else 
     can :read, :all 
    end 
    end 
end 
+0

Cảm ơn bạn Stefan. Thật không may, nó dường như không hoạt động. Nó chỉ áp dụng trường hợp Người dùng và không phải là Quản trị viên. Bất cứ khi nào tôi đăng nhập với tư cách quản trị viên, tôi chỉ có đặc quyền của khách. Có lẽ tôi đang làm điều gì đó sai nhưng tôi không thể tìm ra. – user1464499

+1

Có thể 'Khả năng khởi tạo # không được gọi cho Quản trị viên của bạn. Thêm một số đăng nhập và kiểm tra [Thay đổi mặc định] (https://github.com/ryanb/cancan/wiki/Changing-Defaults). – Stefan

1

này làm việc cho tôi -

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    if user.is_a?(Admin) 
     can :manage, :all 
    elsif user.is_a?(User) 
     can :create, Comment 
     can :read, :all 
    else 
     can :read, :all 
    end 
    end 
end 
10

Giả sử ứng dụng của bạn có hai riêng biệt Devise- mô hình người dùng được hỗ trợ được gọi là UserAdmin. Điều này có nghĩa là bạn sử dụng các phương pháp như current_usercurrent_admin cạnh nhau.

Hãy tiếp tục giả định rằng bạn chỉ có/muốn có một Ability lớp duy nhất, trong đó có tất cả các cài đặt cho phép Cancan của bạn ...

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 
    case user 
    when User 
     can :create, Comment 
     can :read, :all 
    when Admin 
     can :manage, :all 
    end 
    end 
end 

Đây là chính xác những gì người khác đã đề xuất, nhưng có một bước bạn phải lấy.

Theo mặc định, CanCan giả định rằng phương thức current_user tồn tại và sẽ trả về đối tượng Người dùng để so sánh với cài đặt Ability của bạn. Tuy nhiên, người dùng quản trị của chúng tôi có thể được tìm thấy bằng cách sử dụng current_admin. Nếu không nói với CanCan nơi để tìm các đối tượng quản trị, chúng sẽ không bao giờ được xem xét và do đó không bao giờ nhận được các quyền; chúng tôi phải thay đổi các giá trị mặc định khi giao dịch với quản trị viên.

Thêm dòng sau vào application_controller.rb ...

def current_ability 
    if admin_signed_in? 
    @current_ability ||= Ability.new(current_admin) 
    else 
    @current_ability ||= Ability.new(current_user) 
    end 
end 

Bây giờ lớp Khả năng của chúng tôi sẽ xem xét các đối tượng quản lý nếu ai có sẵn, và rơi trở lại vào một tài khoản bình thường khi không có mặt.

Tiếp tục phát triển cho phép chúng ta chuyển quyền quản lý vào lớp Khả năng riêng của họ ...

def current_ability 
    if admin_signed_in? 
    @current_ability ||= AdminPowers.new(current_admin) 
    else 
    @current_ability ||= Ability.new(current_user) 
    end 
end 

Mọi chi tiết, thấy Changing Defaults trong Wiki. Kudos để Stefan để chỉ cho tôi bài viết thích hợp.

FYI - CanCan đã chết, sống lâu CanCanCan! Cập nhật các bản sửa lỗi và tính năng mới. Cùng một không gian tên, do đó, nó chỉ là một thay thế đá quý thả trong Gemfile của bạn.

gem 'cancancan', '~> 1.8' 
+1

sau khi tìm kiếm tôi cuối cùng đã tìm thấy câu trả lời hoàn chỉnh – coderVishal

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