我使用设计进行身份验证并且可以扫描授权,我正在尝试做一些我认为很简单的事情:我想确保一本书的作者只能编辑他的书。
所以,我有以下routes.rb
:
resources :authors do
resources :books
end
和ability.rb
:
class AuthorAbility
include CanCan::Ability
def initialize(user)
can :manage, Book, author_id: user.id
end
end
我遇到的问题是,如果我尝试编辑其他作者的书,我会期望Cancan抛出一个未经授权的例外。它不是!我得到的只是一个错误如下:
ActiveRecord::RecordNotFound at /api/authors/2/books/1
====================================================
> Couldn't find Book with id=1 [WHERE "books"."author_id" = 4]
(gem) activerecord-3.2.12/lib/active_record/relation/finder_methods.rb, line 341
请注意,虽然我的路线建议我是id = 2的作者,但设计说我是id = 4的作者(来自我的auth_token)。它是否应该抛出异常,因为我不是本书的作者(因此是活动记录异常)?
有没有人遇到过这样的用例并成功解决了?
我的一位朋友指出,我可能没有正确授权资源,所以这就是我所拥有的:
class Api::BooksController < Api::ApiController
load_and_authorize_resource :book, :through => :current_api_user
在他指出Cancan实际上是通过:current_api_user范围获取记录(因此它首先没有找到该书)之前进行授权。这导致了这个问题。
删除:through
选项后,我得到了正确的异常......现在我有:
class Api::BooksController < Api::ApiController
load_and_authorize_resource :book
希望这有助于任何人。