0

一段时间以来,我一直坚持这一点,但我没有得到可以使它工作的语法。我想授权用户根据他在关联中的角色更新实例的属性。

我已经尝试过这样的事情,但是在尝试更新其他属性时它不会引发错误

用户模型

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

能力.rb

def initialize(user)

    @user = user || User.new
    can :update, Story, :points do |s|
       @user.has_role?(:team_member, s.project)
     end

end
4

1 回答 1

0

现在,您的能力与能力.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' }      
于 2014-10-07T09:51:34.237 回答