現在、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) に該当する別のシングルトン コントローラーで動作するこの同じ構成があるため、これは通常の状況で既に動作することがわかっています。