- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个具有以下模型的 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
, Editor
或 Viewer
.
这些角色目前没有存储在字典或常量中,只是通过不同的方法以字符串(“Ower”、“Editor”、“Viewer”)的形式分配给一个管理。
在 User
上进行身份验证模型通过 Devise 处理,current_user
方法有效。
为了只允许登录用户访问应用内资源,我已经添加了before_action :authenticate_user!
calendars
中的方法和 administrations
Controller 。
现在,我需要实现一个基于角色的授权系统,所以我只安装了 CanCanCan
gem 。
这是我想要实现的:
user
s 可以创建新的 calendar
s.user
是owner
的 calendar
, 那么他可以 manage
calendar
和所有 administration
属于这个的 calendar
,包括他自己的administration
.editor
的 calendar
, 那么他可以 read
和 update
这个日历,并摧毁他的administration
.user
是viewer
的 calendar
, 那么他可以 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:我继续做一些研究,我意识到我犯了两个错误。
我没有添加 load_and_authorize_resource
到 calendars
和 administrations
Controller 。
我定义了两个属性和两个参数 — 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/
Ability Ability概述 Ability是应用所具备能力的抽象,也是应用程序的重要组成部分。一个应用可以具备多种能力(即可以包含多个Ability),HarmonyOS支持应用以Abilit
Service Ability Service Ability基本概念 基于Service模板的Ability(以下简称“Service”)主要用于后台运行任务(如执行音乐播放、文件下载等),但不提供
Data Ability基本概念 使用Data模板的Ability(以下简称“Data”)有助于应用管理其自身和其他应用存储数据的访问,并提供与其他应用共享数据的方法。Data既可用于同设备不同应用的
Page Ability Page Ability基本概念 Page与AbilitySlice Page模板(以下简称“Page”)是FA唯一支持的模板,用于提供与用户交互的能力。一个Page可以由一
我知道我可以像这样添加动态“字段”: import collection.mutable class DynamicType extends Dynamic { private val field
我想替换MultiSelect与 select2 ,但第一个有一个很棒的功能,允许您单击组标题来匹配其所有子项目。 是否可以用 select2 做类似的事情? 最佳答案 select2 确实允许您选择
在我的 ability.rb ,我有以下规则: elsif user.has_role? :demo can :read, Profile, demo_featured: true, demo_l
我在运行 puppet puppet agent -t 时收到此错误: Error: /Stage[main]/Environment/Environment::Createenv[shared2]/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: hide scrollbar while still able to scroll with mouse/k
我是 Rails 开发的新手,我正在尝试创建我的第一个引擎。该引擎可以使用 CanCan用于授权和限制用户的权限。 我在我的引擎中有一些权限,我想在我的主应用程序中继承它们。 例如: 在我的引擎中文件
我的网站有一个重要的角色方面,我的 ability.rb 文件已经发展成为一个庞然大物。现在它每次都会进行 25 次查询以检查“角色”记录 load_and_authorize_resource叫做。
我用Devise和CanCan成功制作了登录系统,我有3种类型的用户。管理员、内部和全局用户。我创建了 Controller 和索引操作:Admin、Cpanel、Report 和 State,并且我
我正在使用 cancancan 进行授权。 我想允许任何人对某个范围内的用户进行读取访问。 我在 user.rb 中有这个 - class User { describes scope, works
我目前在 Postgres 中工作,并且正在创建一些用户。在创建这些用户并对其进行测试时,我注意到他们能够查看比他们有权访问的更多的模式。除此之外,他们还可以查看受限的 Schemas 表、 View
我在名为 Support 的 lib 文件夹中有一个引擎。在该文件夹中,我有一个 Ticket Controller 。 我在主应用程序中创建了一个能力类,我正试图管理管理员角色的所有模型。当我调用
我正在尝试 Swift 书中的一些示例,即他们拥有的引入下标选项的矩阵示例。这是我的代码: struct Matrix { let rows: Int, columns: Int va
我 fork 了优秀的 zen-coding 项目,想用 ^ 实现 DOM 提升 - 所以你可以这样做: html>head>title^body>h1 而不是 html>(head>title)+b
我有一个具有以下模型的 Rails 应用程序: class User user.id can :manage, :administration, :user_id => user.id
我想通过组合几个现有组件来创建一个(希望是简单的)自定义 Swing 组件。就我而言,它是一个开关,由一个 JLabel 和两个用于打开和关闭的 JButton 组成。我通过扩展 JPanel 开始
如果我重复这个问题,我很抱歉,但我没有找到解决我的问题的方法。 在 React 中检测浏览器切换标签或隐藏浏览器窗口的最佳方法是什么? 我知道有一个 Page visibility API但是我该如何
我是一名优秀的程序员,十分优秀!