我正在开发一个轮询应用程序,并使用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
,那么登录的用户可以查看所有其他用户的民意调查(授权根本不起作用)。
任何人都可以看到我可能会失踪的东西吗?提前谢谢!
答案 0 :(得分:2)
在abiltity.rb
中,您的动词/名词组合为:show_user
和Poll
,但在您的控制器中,您使用的是:show_user
和user
- - 你需要使用Poll
代替。
如果您希望允许用户查看他们自己的Poll
,那么您可能会使用以下内容:
ability.rb
:
can :show_polls_for, User, :id => user.id
polls_controller.rb
:
def show_user
authorize! :show_polls_for, user
...
end