[英]Rails 4 + CanCanCan: “undefined method `role?' for User”
這是關於Rails 4的后續問題:CanCanCan能力與has_many:通過關聯 ,我在這里重述問題,因為我認為上下文略有變化,並且在4次更新后,初始問題的代碼也非常不同。
我還檢查了其他問題,比如未定義的方法'角色?' 對於用戶 ,但它沒有解決我的問題。
那么,我們走了:我有三個型號:
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
,該role
在administration
連接模型中定義(在名為role
的列role
)。
對於每個calendar
, user
只能擁有以下三個role
:所有者,編輯者或查看者。
這些角色當前未存儲在字典或常量中,並且僅通過不同方法作為字符串(“Ower”,“Editor”,“Viewer”)分配給administration
。
User
模型上的身份驗證通過Devise
處理, current_user
方法正在運行。
為了只允許登錄user
訪問應用內資源,我已經添加了before_action :authenticate_user!
calendars
和administrations
控制器中的方法。
現在,我需要實現一個基於角色的授權系統,所以我剛剛安裝了CanCanCan
gem。
這是我想要實現的目標:
user
都可以create
新calendar
。 user
是calendar
的owner
,那么他可以manage
calendar
和屬於該calendar
所有administration
,包括他自己的administration
。 user
是calendar
editor
者,那么他可以read
並update
此calendar
,並destroy
他的administration
。 user
是calendar
viewer
,那么他可以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
本身沒有role
,但只有一個為給定calendar
定義的role
。
這解釋了為什么我得到role?
的NoMethodError
role?
在user
。
那么,問題是:如何檢查給定calendar
的user
role
?
知道如何讓事情發揮作用嗎?
你應該有role?
用戶模型中的方法,如下所示 -
class User < ActiveRecord::Base
has_many :administrations
has_many :calendars, through: :administrations
def role?(type)
administrations.pluck(:role).include?(type.to_s)
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.