これは Rails 4 に関するフォローアップの質問です: CanCanCan 機能 with has_many :through アソシエーション。コンテキストがわずかに変更され、4 回の更新後、最初の質問のコードもかなり異なっていると思われるため、ここで問題を再度述べます。
Undefined method 'role?'などの他の質問も確認しました。Userの場合、しかしそれは私の問題を解決しませんでした。
では、次の 3 つのモデルを用意します。
class User < ActiveRecord::Base
has_many :administrations
has_many :calendars, through: :administrations
end
class Calendar < ActiveRecord::Base
has_many :administrations
has_many :users, through: :administrations
end
class Administration < ActiveRecord::Base
belongs_to :user
belongs_to :calendar
end
与えられたcalendar
に対して、 にuser
は があり、これは結合モデル ( という名前の列)role
で定義されています。administration
role
各calendar
に対して、user
は次の 3 つrole
の のうちの 1 つだけを持つことができます: 所有者、編集者、または閲覧者。
これらの役割は現在、辞書や定数には保存されず、administration
さまざまな方法で文字列 ("Ower"、"Editor"、"Viewer") としてのみ割り当てられます。
User
モデルの認証は を通じて処理されDevise
、current_user
メソッドは機能しています。
ログインした のみがuser
アプリ内リソースにアクセスできるようにするために、およびコントローラーにbefore_action :authenticate_user!
メソッドを既に追加しています。calendars
administrations
ここで、役割ベースの承認システムを実装する必要があるため、CanCanCan
gem をインストールしました。
これが私が達成したいことです:
- すべての (ログインしている)は、新しい
user
を使用できます。create
calendar
- a
user
が a の であるowner
場合、自分の を含め、this に属するすべての およびをcalendar
使用できます。manage
calendar
administration
calendar
administration
- a
user
がeditor
a の場合、calendar
he はread
、update
thiscalendar
、およびdestroy
hisadministration
. - a
user
がviewer
a の場合、calendar
彼はread
これを行うことができcalendar
、destroy
彼のadministration
.
上記を実装するために、次のability.rb
ファイルを作成しました。
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.role?(:owner)
can :manage, Calendar, :user_id => user.id
can :manage, Administration, :user_id => user.id
can :manage, Administration, :calendar_id => calendar.id
elsif user.role?(:editor)
can [:read, :update], Calendar, :user_id => user.id
can :destroy, Administration, :user_id => user.id
elsif user.role?(:viewer)
can [:read], Calendar, :user_id => user.id
can :destroy, Administration, :user_id => user.id
end
end
end
ログインして任意のカレンダー ページ (インデックス、表示、編集) にアクセスしようとすると、次のエラーが表示されます。
NoMethodError in CalendarsController#show
undefined method `role?' for #<User:0x007fd003dff860>
def initialize(user)
user ||= User.new
if user.role?(:owner)
can :manage, Calendar, :user_id => user.id
can :manage, Administration, :user_id => user.id
can :manage, Administration, :calendar_id => calendar.id
user
問題は、 arole
自体がなく、特定の に対してのみrole
定義されているという事実に起因すると思いcalendar
ます。
NoMethodError
これは、 for がrole?
onになる理由を説明していuser
ます。
したがって、問題は次のようになります。user
role
特定の をチェックする方法はcalendar
?
物事を機能させる方法はありますか?