了解康康舞的能力

时间:2011-08-11 21:29:22

标签: ruby-on-rails cancan

尝试让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

1 个答案:

答案 0 :(得分:4)

这一行:

- if can? :update, @post   <- doesn't work

问CanCan“我能否更新这篇特定的帖子。”您根据所有帖子定义了该能力。如果你做了:

can :update, Post, :user_id => user.id

然后你的“如果可以吗?”会工作,用户只能更新自己的帖子。因此,如果有关此资源实例的某些内容确定了权限,并且您希望使用类版本(“Post”),如果用户具有所有实例的能力,则您希望使用特定资源版本(“@ post”)上课。