Rails 3,Cancan:定义处理集合的自定义控制器操作的能力,而不是成员

时间:2012-10-11 16:31:13

标签: ruby-on-rails cancan

我有一个模型UserResource的RESTful控制器。我添加了一个名为remote_update的自定义操作,我希望仅在用户的ID匹配时限制该操作:

if user.has_role? :admin
  can :manage, :all

elsif user.has_role? :regular
  can [:remote_update], UserResource, :user_id => user.id

end

我在控制器中使用load_and_authorize_resource

问题是即使用户ID不匹配,用户仍然可以使用该操作。 (为了测试,我正在使用Firebug并更改id的隐藏值。)

我的路线如下:

resources :user_resources do

collection do
  post 'remote_update'
end

根据https://github.com/ryanb/cancan/wiki/Authorizing-controller-actions,当我们有自定义操作时,Cancan会尝试使用ID从链接加载资源:

def discontinue
 # Automatically does the following:
 # @product = Product.find(params[:id])
 # authorize! :discontinue, @product
end

我没有定义id,因为它是POST,而不是GET或PUT。 关于如何构建能力的问题?谢谢。

1 个答案:

答案 0 :(得分:1)

看起来您正在尝试使用POST进行更新('remote_update')。应该创建一个POST,因此通常不应该有一个填充的id。因此我不希望CanCan为你做那个查找。

我建议您:

手动查找产品并在您的停止方法中对其进行授权,

使用PUT

顺便说一句,这种能力对我来说是正确的。