- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Rails 的初学者,并且一直在寻找这个问题的许多建议答案。我似乎无法翻译答案,我已经看到了我的情况。我希望有人会很好地阐明它。我关心的两个模型是用户和项目。每个用户都可以创建一个项目,但每个用户也可以管理一个项目。为此,我在 User 和 Project 之间创建了一个 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/
如何为 CanCan 设置角色,以及如何将这些角色分配给用户?我现在至少希望在注册时有一个下拉菜单,供用户选择他们的角色。我对所有文档都不太确定,我似乎一直想念这个,但非常感谢任何帮助! 最佳答案 这
我正在努力实现 CanCan。出于某种原因,当我尝试获取有关模型权限的具体信息时,CanCan 不断给我拒绝访问。我不明白为什么。 有没有办法让 CanCan 变得具体,也许在日志中或在开发中关于为什
假设您正在为 Blogger 编写软件。 每个用户只有在他们是博客的所有者时才能创建博客文章。在这种情况下,CanCan 通常会将能力检查定义为: user.can? :create, Post 但是
第三天我很痛苦,我不明白为什么我没有通过下一个测试: 4) Error: ArticlesControllerTest#test_should_get_index_if_admin: CanCan:
我想为我的 User 模型添加额外的属性,并且不想创建单独的 Profile 模型。我正在尝试使用来自 RESTful 操作集的标准 «update» 更新自定义字段: class UsersCont
我在 Rails 4 中工作,并且根据 this issue 中的说明让 CanCan 工作得很好,除了我认为可能相对常见的一个用例。 我有一个 Comment 模型,其中 has_many :com
我正在尝试在 spree 中授予一些自定义角色特定权限。在任何地方都找不到这个答案 角色能力.rb class RoleAbility include CanCan::Ability def in
我如何在事件管理员和 cancan 中使用范围。 我有管理员用户并且那些与机构有(has_one)关系 和机构有很多简介 现在,当管理员用户登录时,我想显示所有具有相同机构的个人资料。 发现以下链接没
我有可以选择通过其他资源访问的资源,就像这样 resources :projects do resources :tasks end resources :tasks 如果任务是通过项目访问的,我
我已经使用Devise和CanCan启动了Rails应用程序。我有与文章具有一对多关系的用户。我是CanCan的新手,这是我打算做的事情: 管理员 可以对文章采取任何措施 登录用户 可以阅读和创建文章
我正在使用 Rails 设置一个非常基本的 Web 应用程序,我已经设置好设计并开始工作。 我现在的问题是,无论我登录的是谁,我都可以查看和销毁我上次登录的帐户的内容。 我只需要两种类型的角色,成员和
我有一个 发表 带有 :published 的型号属性( bool 值)和 用户 带有 role 的型号属性(字符串)。共有三个角色:ROLES = %w[admin publisher author
我正在尝试将 cancan 合并到我的第一个 Ruby on Rails 应用程序中。 我在入门时遇到问题...这肯定是一些基本问题。 我的应用程序有一个项目列表,用户可能有权也可能没有权限查看其中任
我的问题是关于在以下上下文中定义 cancancan 能力。 我有一个通用模型,其中包含用户和公司实体之间的多对多关系 class User {:users => {:id => user.id}}
我目前在我的网络应用程序中使用 cancan,到目前为止它运行良好,但我遇到了一个关于 Rails 中嵌套资源的问题。当访问索引页面时,cancan 不会限制用户看到其他登录用户可以看到的内容。它在显
我正在使用其他人的代码,而且我对 Rails 相当缺乏经验,而且我在使用 CanCan & Devise 时遇到了问题。 当尝试登录时(使用我知道的凭据,因为它们以前有效并且我已经检查了数据库并成功使
我的问题是关于在以下上下文中定义 cancancan 能力。 我有一个通用模型,其中包含用户和公司实体之间的多对多关系 class User {:users => {:id => user.id}}
我有带有 Cancan 1.6.9 的 Rails 3 应用程序进行授权。我想将能力类转换为 JSON。这是我的能力类。 # encoding: utf-8 module Ability def
我已经为此苦苦挣扎了一段时间,终于到了 CanCan 似乎不允许您授权一组记录的地步。例如: ads_controller.rb def index @ads = Ad.where("ads.
我无法解决 CanCan gem 的问题。在我的 Controller 中,我有“确认”操作,这是“预订”资源的成员路由。我不想在此操作中通过 CanCan 授权资源,所以我在 Controller
我是一名优秀的程序员,十分优秀!