0

私は認証に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

これが誰にも役立つことを願っています。

4

0 に答える 0