2011-12-16 82 views
1

我已經安裝了設計。如何設置康康?

我做到了,

rails g cancan:ability 

這是能力I類中應用了/模型

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    # Define abilities for the passed in user here. For example: 
    # 
    # user ||= User.new # guest user (not logged in) 
    # if user.admin? 
    #  can :manage, :all 
    # else 
    #  can :read, :all 
    # end 
    # 
    # The first argument to `can` is the action you are giving the user permission to do. 
    # If you pass :manage it will apply to every action. Other common actions here are 
    # :read, :create, :update and :destroy. 
    # 
    # The second argument is the resource the user can perform the action on. If you pass 
    # :all it will apply to every resource. Otherwise pass a Ruby class of the resource. 
    # 
    # The third argument is an optional hash of conditions to further filter the objects. 
    # For example, here the user can only update published articles. 
    # 
    # can :update, Article, :published => true 
    # 
    # See the wiki for details: https://github.com/ryanb/cancan/wiki/Defining-Abilities 
    end 
end 

職位表

        Table "public.posts" 
    Column |   Type   |      Modifiers      
-------------+------------------------+---------------------------------------------------- 
id   | integer    | not null default nextval('posts_id_seq'::regclass) 
title  | character varying(100) | not null 
content  | character varying(500) | not null 
created_at | date     | 
updated_at | date     | 
tags  | character varying(55) | not null default '50'::character varying 
category_id | integer    | not null default 1 
user_id  | integer    | 
Indexes: 
    "posts_pkey" PRIMARY KEY, btree (id) 

用戶表

          Table "public.users" 
     Column   |   Type    |      Modifiers      
------------------------+-----------------------------+---------------------------------------------------- 
id      | integer      | not null default nextval('users_id_seq'::regclass) 
email     | character varying(255)  | not null default ''::character varying 
encrypted_password  | character varying(128)  | not null default ''::character varying 
reset_password_token | character varying(255)  | 
reset_password_sent_at | timestamp without time zone | 
remember_created_at | timestamp without time zone | 
sign_in_count   | integer      | default 0 
current_sign_in_at  | timestamp without time zone | 
last_sign_in_at  | timestamp without time zone | 
current_sign_in_ip  | character varying(255)  | 
last_sign_in_ip  | character varying(255)  | 
confirmation_token  | character varying(255)  | 
confirmed_at   | timestamp without time zone | 
confirmation_sent_at | timestamp without time zone | 
username    | character varying(255)  | not null 
is_admin    | boolean      | default false 
created_at    | timestamp without time zone | 
updated_at    | timestamp without time zone | 
Indexes: 
    "users_pkey" PRIMARY KEY, btree (id) 
    "index_users_on_confirmation_token" UNIQUE, btree (confirmation_token) 
    "index_users_on_email" UNIQUE, btree (email) 
    "index_users_on_reset_password_token" UNIQUE, btree (reset_password_token) 
    "index_users_on_username" UNIQUE, btree (username) 

現在如何設置cancan以允許/拒絕PostController,CommentsController的某些操作?如果user.is_admin = true則用戶可以編輯,刪除帖子,評論。否則,普通用戶只能在註冊後添加帖子。任何訪客用戶都可以評論任何帖子。

在PostsController我

before_filter :authenticate_user! , :except => [:index, :show, :bla1, :bla2, :bla3, :bla4, :bla5, :bla6, :bla7, :bla8, :bla9] 

在每個控制器我不得不寫這樣的線,這是乏味的。是否有任何捷徑可以減少每個控制器中的這種線路?

+1

您只能用作白名單。 `before_filter:authoenticate_user! :only =>:create` – Gazler 2011-12-16 14:27:23

回答

2

你應該設置你的ability.rb這種方式。

class Ability 
    include CanCan::Ability 

    def initialize(user) 

    # rules for admin 
    if user.is_admin? 
     #if admin can do anything 
     can :manage, :all 
     #if admin can only edit and destroy posts and comments 
     can :edit, Post 
     can :destroy, Post 
     can :edit, Comment 
     can :destroy, Comment 
    end 

    #rules for registred user 
    can :create, Post 
    end 
end 

,並在你的控制器

class PostsController < ApplicationController 
    authorize_resource :except => show 
end 

class CommentsController < ApplicationController 
    authorize_resource :only => [:edit,:update,:destroy] 
end 

希望這將是有益的。 :)