尝试让Cancan在一个应用程序中保护一些模型,并好奇为什么它不能像我想象的那样工作。我原以为你可以在特定实例上can?
而不是整个类,所以,不是在这个例子中,你可以在每个实例的基础上启用能力,因为显示了一个帖子列表?!?
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user (not logged in)
if user.role? :admin
can :manage, :all
elsif user.role? :moderator
can :manage, Post
else
can :read, :all
end
end
end
# posts/index.html.haml
...
- if can? :update, @post <- doesn't work
- if can? :update, Post <- works
修改:添加PostsController.rb
#posts_controller.rb
class PostsController < ApplicationController
before_filter :login_required, :except => [:index, :show]
load_and_authorize_resource :except => [:create]
def index
# @posts = Post.all ## <- handled by Cancan's load_and_authorize_resource
@events = Event.where("end_date <= :today", :today => Date.today)
@next_event = Event.next
respond_to do |format|
format.html # index.html.erb
format.json { render json: @posts }
end
end
...
end
答案 0 :(得分:4)
这一行:
- if can? :update, @post <- doesn't work
问CanCan“我能否更新这篇特定的帖子。”您根据所有帖子定义了该能力。如果你做了:
can :update, Post, :user_id => user.id
然后你的“如果可以吗?”会工作,用户只能更新自己的帖子。因此,如果有关此资源实例的某些内容确定了权限,并且您希望使用类版本(“Post”),如果用户具有所有实例的能力,则您希望使用特定资源版本(“@ post”)上课。