gpt4 book ai didi

ruby-on-rails - 用 has_many :through association 定义能力(CanCan)

转载 作者:行者123 更新时间:2023-12-01 09:29:39 24 4
gpt4 key购买 nike

我是 Rails 的初学者,并且一直在寻找这个问题的许多建议答案。我似乎无法翻译答案,我已经看到了我的情况。我希望有人会很好地阐明它。我关心的两个模型是用户和项目。每个用户都可以创建一个项目,但每个用户也可以管理一个项目。为此,我在 UserProject 之间创建了一个 has_many :through 关系,使用管理模型连接这两个模型。

用户.rb

 has_many :managings, foreign_key: "manager_id", dependent: :destroy
has_many :managed_projects, through: :managings

managing.rb

belongs_to :manager, class_name: "User"
belongs_to :managed_project, class_name: "Project"

项目.rb

has_one :reverse_managing, foreign_key: "managed_project_id",
class_name: "Managing",
dependent: :destroy
has_one :manager, through: :reverse_managing, source: :manager

所以,我有一个叫做“初学者”的角色。初学者只能阅读项目,除了那些选择成为项目经理的人。还应允许经理编辑和更新他们正在管理的项目。

下面是我在ability.rb中的尝试

 user ||= User.new # guest user (not logged in)
if user.role? :Admin
can :manage, :all
elsif user.role? :Author
can :read, :all
can [:create], [Project]
can [:edit, :update], Project, :user_id => user.id
elsif user.role? :Beginner
can :read, :all

can [:edit, :update], Project, :manager_id => user.id
end

最后一行似乎不起作用,因为当我查看管理该项目的初学者的项目 View 时,我没有看到编辑链接。

这是我在 View 中使用的代码:

<% if can? :update, project  %>
<%= link_to 'Edit', edit_project_path(project) %>
<% end %>

这就是 projects_controller 中出现的内容

def edit
@project = Project.find(params[:id])
authorize! :edit, @project
end

如果有人可以帮助我,我会睡一个快乐的人

更新

这里的作用是? User.rb 中的方法

def role?(role)
return !!self.roles.find_by_name(role.to_s.camelize)
end

更新

我为用户分配了错误的 role_id。更正此问题后,当我尝试打开包含编辑链接的项目 View 时收到一条错误消息。

undefined method `manager_id' for #<Project:0xb387f0b0>

最佳答案

问题出在这里:

can [:edit, :update], Project, :manager_id => user.id

cancan 能力条件只能使用数据库列(根据 cancan wiki)。这里 cancan 期望 manager_id 是 Project 模型中的一个列,实际上并非如此。你的模型看起来有点像这样:

用户 [id, ...]
项目 [id, ...]
管理 [manager_id, managed_project_id, ...]

manager_id 是管理中的字段,而不是项目中的字段。

解决方法是使用另一个 wiki page 中描述的 block 条件。 .我还没有测试过,但我认为以下方法会起作用 -

can [:edit, :update], Project do |p|
p.manager == user
end

关于ruby-on-rails - 用 has_many :through association 定义能力(CanCan),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17175611/

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