gpt4 book ai didi

ruby-on-rails - Rails 4 + CanCanCan : "undefined method ` role ?' for User"

转载 作者:行者123 更新时间:2023-12-04 05:32:59 25 4
gpt4 key购买 nike

这是 Rails 4: CanCanCan abilities with has_many :through association 上的后续问题我在这里重申这个问题,因为我相信上下文略有变化,并且在 4 次更新后,初始问题中的代码也大不相同。

我还检查了其他问题,例如 Undefined method 'role?' for User ,但并没有解决我的问题。

所以,我们开始吧:我有三个模型:

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只能有以下三个 role 之一s:所有者、编辑者或查看者。

这些角色当前未存储在字典或常量中,仅分配给 administration通过不同的方法作为字符串(“Ower”、“Editor”、“Viewer”)。

User 上进行身份验证模型通过 Devise 处理,以及 current_user方法正在起作用。

为了只允许登录 user s 访问应用内资源,我已经添加了 before_action :authenticate_user! calendars 中的方法和 administrations Controller 。

现在我需要实现一个基于角色的授权系统,所以我只安装了 CanCanCan gem 。

这是我想要实现的目标:
  • 全部(已登录)user s 可以 create新品 calendar s。
  • 如果 userownercalendar ,那么他就可以manage calendar以及所有 administration属于此的 s calendar ,包括他自己的 administration .
  • 如果 usereditorcalendar ,那么他就可以readupdatecalendar , 和 destroy他的 administration .
  • 如果 userviewercalendar ,那么他就可以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本身,但只有一个 role为给定 calendar 定义.

    这解释了为什么我会收到 NoMethodErrorrole?user .

    所以,问题是:如何检查 user role对于给定的 calendar ?

    知道如何让事情发挥作用吗?

    最佳答案

    你应该有 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

    关于ruby-on-rails - Rails 4 + CanCanCan : "undefined method ` role ?' for User",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32357740/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com