1

現在、CanCan の最新バージョンで問題が発生しています。gem は、複数形の名前を持つシングルトン リソースをロードしないようです。

class Preferences < ActiveRecord::Base
  self.table_name = 'preferences'
  belongs_to :user
end

class User < ActiveRecord::Base
  has_one :preferences
end

#controller
class PreferencesController < ApplicationController
  before_filter :authenticate_user! #from Devise

  load_and_authorize_resource :singleton => true,
                              :through => :current_user,
                              :through_association => :preferences,
                              :parent => false
end

#ability.rb
class Ability
  include CanCan::Ability

  def initialize(user)
    can [:read, :update], Preferences, :user_id => user.id
  end
end

コントローラー仕様を実行すると、次のようなエラーが発生し続けます。

Failures:

 1) PreferencesController GET #show should return http success
     Failure/Error: get :show
     NameError:
       uninitialized constant Preference
     # ./spec/controllers/preferences_controller_spec.rb:10:in `block (3 levels) in <top (required)>'

私が試した引数の組み合わせに関係なくload_resource、次のようにリソースを手動でロードすることに戻らない限り、仕様を再び渡すことはできません。

class PreferencesController < ApplicationController
  before_filter :authenticate_user!

  def show
    @preferences = current_user.preferences
    authorize! :read, @preferences
  end
end

load_and_authorize_resource使用する必要があるパラメーターの魔法の組み合わせはありますか? リソースが通常の Rails 規則 (つまり、User has_one :profile) に該当する別のシングルトン コントローラーで動作するこの同じ構成があるため、これは通常の状況で既に動作することがわかっています。

4

0 に答える 0