簡體   English   中英

Rails 4 + CanCanCan:“未定義的方法`角色?” 對於用戶“

[英]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

對於給定calendaruser具有role ,該roleadministration連接模型中定義(在名為role的列role )。

對於每個calendaruser只能擁有以下三個role :所有者,編輯者或查看者。

這些角色當前未存儲在字典或常量中,並且僅通過不同方法作為字符串(“Ower”,“Editor”,“Viewer”)分配給administration

User模型上的身份驗證通過Devise處理, current_user方法正在運行。

為了只允許登錄user訪問應用內資源,我已經添加了before_action :authenticate_user! calendarsadministrations控制器中的方法。

現在,我需要實現一個基於角色的授權系統,所以我剛剛安裝了CanCanCan gem。

這是我想要實現的目標:

  • 所有(已登錄) user都可以createcalendar
  • 如果usercalendarowner ,那么他可以manage calendar和屬於該calendar所有administration ,包括他自己的administration
  • 如果usercalendar editor者,那么他可以readupdatecalendar ,並destroy他的administration
  • 如果usercalendar viewer ,那么他可以readcalendar ,並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

那么,問題是:如何檢查給定calendaruser 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM