将cancan应用于自定义操作

时间:2012-11-24 08:04:12

标签: ruby-on-rails-3 cancan

我正在开发一个轮询应用程序,并使用Devise和Cancan进行身份验证和授权。我有一个由Devise和Poll模型生成的User模型。民意调查属于用户。我的问题是我的民意调查控制器中有自定义操作,我无法让Cancan使用该自定义操作。这就是我在我的代码中尝试做的事情:

配置/ routes.rb中:

match 'users/:user_id/polls' => 'polls#show_user'

Ability.rb:

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

  if user.is? :admin
    can :manage, :all
  else # default
    can :read, :all
    can :manage, Poll, :user_id => user.id
    can :show_user, Poll, :user_id => user.id
  end # if else admin
end

polls_controller.rb:

class PollsController < ApplicationController
  before_filter :authenticate_user!
  load_and_authorize_resource :except => :show_user

  def show_user
    authorize! :show_user, user
    @polls = Poll.find_all_by_user_id(params[:user_id])
    render "index"
  end
  <...>
end

这个想法是只有在投票的所有者登录时才能查看用户的民意调查。但是,使用此代码,当民意调查的所有者​​登录时,该用户会被踢出该页面并显示一条消息说授权失败了。如果我删除了行authorize! :show_user, user,那么登录的用户可以查看所有其他用户的民意调查(授权根本不起作用)。

任何人都可以看到我可能会失踪的东西吗?提前谢谢!

1 个答案:

答案 0 :(得分:2)

abiltity.rb中,您的动词/名词组合为:show_userPoll,但在您的控制器中,您使用的是:show_useruser - - 你需要使用Poll代替。

如果您希望允许用户查看他们自己的Poll,那么您可能会使用以下内容:

ability.rb

can :show_polls_for, User, :id => user.id

polls_controller.rb

def show_user
  authorize! :show_polls_for, user
  ...
end