2011-10-26 18 views
10

tôi đã tự hỏi làm thế nào tôi có thể định nghĩa một lớp khả năng và phục vụ mà lớp khả năng tùy thuộc vào người sử dụng đã đăng nhập.Rails Can Can Khả Lớp Đối với nhiều lập mưu Models

Tôi đang sử dụng Active Admin, Can Can và lập mưu và tôi đã tạo thành công mô hình User và AdminUser.

Tôi có điều này trong ability.rb tôi

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 

    if (user) 
     can :manage, Item 
    end 
    end 
end 

Bây giờ tôi đã sử dụng lối vào wiki này để xác định rằng chúng ta thực sự có thể định nghĩa một tập tin khả năng tùy chỉnh và sử dụng rằng thay vì ability.rb:

https://github.com/ryanb/cancan/wiki/changing-defaults

Nhưng những gì tôi muốn làm là, có thể sử dụng ability.rb nếu một "người dùng không phải quản trị" được đăng nhập và một tùy chỉnh abilty nếu một quản trị người dùng được đăng nhập.

Câu hỏi phụ: Có thể làm như vậy mà tôi không cần tùy chỉnh và tôi có thể đặt quyền trong một tệp khả năng.rb không?

+0

Ah, bạn nói đúng. Tôi không nhận thấy rằng bạn đã sử dụng một lớp riêng biệt cho Người dùng và Người dùng quản trị viên. Bạn sẽ có thể thay đổi lớp được sử dụng bởi Quản trị viên hoạt động, nhưng không phải là người dùng của hệ thống đó, tôi không chắc chắn chính xác vị trí đó. Có lẽ nên kiểm tra initializers của bạn mặc dù. – jdl

Trả lời

12

Tôi chưa bao giờ thực sự sử dụng ActiveAdmin, vì vậy tôi không hoàn toàn chắc chắn nếu tôi thiếu thứ gì đó, nhưng dường như khung đó không dựa trên CanCan. Đó là lý do tại sao tôi giả sử bạn đang xác định phương thức current_ability như được giải thích trong wiki và được khởi tạo với Ability.new(current_user).

Nếu đó là trường hợp, và current_user của bạn có thể là một User hay một AdminUser, sau đó không có vấn đề trong việc kiểm tra cho rằng trong lớp Ability:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 

    if user.kind_of? AdminUser 
     can :manage, Item 
    elsif user.kind_of? User 
     can :read, Item 
    end 
    end 
end 

Bạn chỉ có thể có một cái nhìn tại người dùng của nhập và thay đổi các quy tắc cho phù hợp. Bạn cũng có thể sử dụng is_a? thay vì kind_of? để kiểm tra chặt chẽ hơn nhưng có thể không bắt buộc và có thể gây ra sự cố nếu bạn quyết định thực hiện kế thừa sau này.

Một cách khác bạn có thể kiểm tra là xác định phương thức admin? trong cả hai kiểu máy. Điều này có thể là một cách tốt hơn để làm điều đó, kể từ khi kiểm tra loại rõ ràng không phải là rất phổ biến trong ruby ​​- nó thường hạn chế sự lựa chọn của bạn. Nó có thể trông giống như sau:

class User < ActiveRecord::Base 
    def admin? 
    false 
    end 
end 

class AdminUser < ActiveRecord::Base 
    def admin? 
    true 
    end 
end 

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 

    if user.admin? 
     can :manage, Item 
    else 
     can :read, Item 
    end 
    end 
end 
Các vấn đề liên quan