私は認証にdeviseを使用し、承認を処理するためにcancanを使用しています。簡単だと思うことをしようとしています:本の著者が自分の本だけを編集できるようにしたいです。
だから、私は次のものを持っています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 が Unauthorized 例外をスローすることを期待することです。そうではない!そして、私が得るのは次のようなエラーだけです:
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 の作成者であることを示唆していますが、devise は私が実際には 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
これが誰にも役立つことを願っています。