我有点困难,但是我没有得到可以使这项工作的语法。 我想授权用户根据他在关联中的角色来更新实例的属性。
我尝试过这样的事情,但在尝试更新其他属性时不会引发错误
用户模型
class User < ActiveRecord::Base
rolify
...
end
项目模型
class Project < ActiveRecord::Base
resourcify
has_many :stories, dependent: :destroy
...
end
故事模型
class Story < ActiveRecord::Base
belongs_to :project
...
end
故事控制器
class StoriesController < ApplicationController
...
def update
story = Project.find(params[:project_id]).stories.find(params[:id])
authorize! :update, story
if story.update_attributes(story_params)
render json: story
else
render status: :unprocessable_entity, json: {errors: story.errors}
end
end
...
end
ability.rb
def initialize(user)
@user = user || User.new
can :update, Story, :points do |s|
@user.has_role?(:team_member, s.project)
end
end
答案 0 :(得分:0)
现在你的能力与ability.rb文件紧密耦合。每当您需要添加或更改角色(或能力)时,您都必须更改代码。
您可以为角色添加权限(作为新的另一个模型或只是一个json字段)并在功能中迭代它。初始化程序。
user.roles.each do |role|
role.permissions.each do |rights, value|
value.each do |action, subject|
case rights
when "can"
subject == 'all' ? (can action.to_sym, :all) : (can action.to_sym, subject.classify.constantize)
when "cannot"
subject == 'all' ? (cannot action.to_sym, :all) : (cannot action.to_sym, subject.classify.constantize)
end
end
end
end
因此,您可以在数据库中存储权限,使用某些管理员面板进行编辑等。在您的情况下,它可能如下所示:
# @user.roles.find_by_name('team_member').permissions
'can' => { 'update' => 'story' }