2

我正在开发一个投票应用程序,并使用 Devise 和 Cancan 进行身份验证和授权。我有一个由 Devise 生成的用户模型和一个投票模型。投票属于用户。我的问题是我的 Polls 控制器中有一个自定义操作,我无法让 Cancan 使用该自定义操作。这是我试图在我的代码中做的:

配置/路由.rb:

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

能力.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,则已登录的用户可以查看所有其他用户的投票(授权根本不起作用)。

谁能看到我可能缺少的东西?提前致谢!

4

1 回答 1

2

abiltity.rb, 你的动词/名词组合是:show_userand Poll,但是在你的控制器中你使用:show_userand user--你需要使用 aPoll来代替。

相反,如果您希望允许用户查看他们自己的所有Polls,您可能会使用以下内容:

ability.rb

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

polls_controller.rb

def show_user
  authorize! :show_polls_for, user
  ...
end
于 2012-11-24T09:29:52.623 回答