2012-10-05 29 views
6

Tôi đang sử dụng đường ray 3.0.9, cancan 1.6.7 và thiết lập 1.4.8Có thể sử dụng cancan với hai lớp khả năng

Tôi đang sử dụng hai mô hình dự kiến ​​(Người dùng và Quản trị) cho nhật ký khác nhau Vì vậy, tôi muốn chia các khả năng phụ thuộc vào người dùng đã đăng nhập (tài nguyên), bởi vì có nhiều hơn 70 mô hình và chỉ có 10 kiểu phổ biến cho cả hai loại người dùng (ở đây nhiều hơn 50 mô hình và chế độ xem chỉ được sử dụng bởi người dùng Quản trị)

Tôi muốn triển khai hai lớp Khả năng (UserAbility và AdminAbility) và thiết lập phương pháp helper CURRENT_USER/current_admin phải được chuyển vào UserAbility/AdminAbility

Ví dụ:

Trong ApplicationController.rb nộp

def current_ability 
     if current_user 
      @current_ability = UserAbility.new(current_user) 
     elsif current_admin 
      @current_ability = AdminAbility.new(current_admin) 
     end 
    end 

Từ trên câu hỏi của tôi,

  1. là nhiều khả năng lớp có thể trong cancan, nếu có thể thì làm thế nào để tạo nó bởi vì tôi đã thử

    rails g cancan:user_ability

    nhưng tôi đã nhận lỗi như không thể tìm thấy máy phát điện Cancan: user_ability.

  2. Cách chọn lớp Khả năng thích hợp cho Người dùng/quản trị đã đăng nhập.

  3. Nếu một bộ điều khiển được truy cập bởi cả người dùng và quản trị, thì làm sao tôi có thể có được sự hiện đăng nhập tài khoản/quản trị của đối tượng

Có giải pháp nào khác cho việc này?

Bất kỳ một xin vui lòng giúp đỡ để giải quyết việc này

Trả lời

12

... những gì đã nói, bạn có thể sử dụng nhiều mô hình khả năng trực tiếp nếu bạn thích:

class UserAbility 
    include CanCan::Ability 

    def initialize(user) 
    can :read, :all 
    end 
end 

class AdminAbility 
    include CanCan::Ability 

    def initialize(admin) 
    can :manage, :all 
    end 
end 

class ApplicationController < ActionController::Base 
    # overriding CanCan::ControllerAdditions 
    def current_ability 
    if current_account.kind_of?(AdminUser) 
     @current_ability ||= AdminAbility.new(current_account) 
    else 
     @current_ability ||= UserAbility.new(current_account) 
    end 
    end 
end 
+0

vâng tôi đã cố gắng cho điều này chỉ, nhưng tôi đã cố gắng rất nhiều để tạo ra một lớp khả năng cancan khác nhưng tôi không thể (có thể là tôi không biết cú pháp đúng) – nishanthan

+0

Bạn không cần một máy phát điện - chỉ cần tạo một tệp mới trong 'ứng dụng/mô hình' và' bao gồm CanCan :: Ability'. – willglynn

+0

Cảm ơn cả hai hoạt động tốt – nishanthan

7

Bạn không cần nhiều lớp khả năng cho rằng:

class Ability 
    include CanCan::Ability 

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

    common_rules(user_or_admin) 

    if user_or_admin.kind_of? Admin 
     admin_rules(user_or_admin) 
    else 
     user_rules(user_or_admin) 
    end 
    end 

    def common_rules(user_or_admin) 
    # can :verb, :noun 
    end 

    def admin_rules(admin) 
    can :manage, :all 
    end 

    def user_rules(user) 
    can :read, :all 
    end 
end 

Cancan cuối cùng sẽ được gọi Ability.new() với một trong hai mô hình, nhưng đó là hoàn toàn tốt đẹp, vì bạn có thể kiểm tra loại đối tượng bạn nhận được. Bạn có thể, tất nhiên, đại biểu cho các đối tượng khác nếu bạn thích; tất cả chỉ là Ruby.

+0

Cảm ơn @willglynn, tôi sẽ đi cho nó và xin vui lòng cho tôi biết, là nó có thể gọi một phương thức helper hiện trả về đăng nhập tài khoản/đối tượng quản lý của mỗi thời gian theo quan điểm hoặc có bất kỳ khác cách để có được đối tượng này – nishanthan

+0

Điều đó phụ thuộc vào phần còn lại của ứng dụng của bạn. Nó chắc chắn có thể, nhưng tôi không thể cho bạn biết làm thế nào. – willglynn

+0

Ok tôi hiểu rồi, cảm ơn câu trả lời của bạn – nishanthan

0

tôi sẽ thêm vào những gì willgiynn has answered. Có vẻ như tôi phải thêm một số mã nữa để làm cho nó hoạt động. Tôi đã tìm thấy câu trả lời từ số này post

Thêm thông tin 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 
Các vấn đề liên quan