Cancan rolify:定义使用块更新资源属性的功能

时间:2014-08-21 10:47:27

标签: ruby-on-rails cancan rolify

我有点困难,但是我没有得到可以使这项工作的语法。 我想授权用户根据他在关联中的角色来更新实例的属性。

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

用户模型

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

1 个答案:

答案 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' }