gpt4 book ai didi

ruby-on-rails - rails 4 : CanCanCan abilities with has_many :through association

转载 作者:行者123 更新时间:2023-12-04 18:02:39 30 4
gpt4 key购买 nike

我有一个具有以下模型的 Rails 应用程序:

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 中定义加入模型。

对于每个日历,用户只能拥有以下三种角色之一:Owner , EditorViewer .

这些角色目前没有存储在字典或常量中,只是通过不同的方法以字符串(“Ower”、“Editor”、“Viewer”)的形式分配给一个管理。

User 上进行身份验证模型通过 Devise 处理,current_user方法有效。

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

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

这是我想要实现的:

  • 全部(已登录)user s 可以创建新的 calendar s.
  • 如果 userownercalendar , 那么他可以 manage calendar和所有 administration属于这个的 calendar ,包括他自己的administration .
  • 如果用户是 editorcalendar , 那么他可以 readupdate这个日历,并摧毁他的administration .
  • 如果 userviewercalendar , 那么他可以 read这个calendar , 和 destroy他的 administration .

为了实现上述目标,我想出了以下 ability.rb文件:

class Ability
include CanCan::Ability

def initialize(user, calendar)
user ||= User.new
calendar = Calendar.find(params[:id])
user can :create, :calendar
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

因为我对 Rails 不是很熟悉,而且这是我第一次使用 CanCanCan ,我对我的代码不是很有信心,想要一些验证或改进建议。

那么,这段代码是否有效,是否能让我实现我需要的目标?

更新:使用当前代码,当我以用户身份登录并访问另一个用户日历的 calendars#show 页面时,我实际上可以访问该日历,但我不应该这样做。

很明显,我的代码无法正常工作。

知道我做错了什么吗?

更新 2:我认为我的代码中存在错误,因为我使用的是 :model而不是 Model允许user s 对给定的 model 执行操作.

但是,代码仍然无法正常工作。

知道这里可能出了什么问题吗?

更新 3:问题可能是由于我使用 if user.role?(:owner) 引起的吗?检查用户的角色是否设置为所有者,而在数据库中该角色实际上定义为“所有者”(作为字符串)?

更新 4:我继续做一些研究,我意识到我犯了两个错误。

  1. 我没有添加 load_and_authorize_resourcecalendarsadministrations Controller 。

  2. 我定义了两个属性和两个参数 — initialize(user, calendar) — 而不是我的 initialize 中的一个方法。

因此,更新两个 Controller 以及 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

现在,当我尝试访问不属于 current_user 的日历时,我收到以下错误:

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

我该如何解决这个问题?

最佳答案

没有这样的方法 role? User 模型。 Cancancan 文档错误地假设示例中存在这种方法。

要解决这个问题,您应该这样做:

if user.role == 'Owner'
...
elsif user.role == 'Editor'
...
elsif user.role == 'Viewer'
...

关于ruby-on-rails - rails 4 : CanCanCan abilities with has_many :through association,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32342953/

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