gpt4 book ai didi

ruby-on-rails - 使用 cancan 时如何设置范围集中分配?

转载 作者:行者123 更新时间:2023-12-03 03:50:42 30 4
gpt4 key购买 nike

假设我有一个模型“ channel ”(类(class)是一个 bool 属性):

class Channel < ActiveRecord::Base
attr_accessible :title
attr_accessible :course, :title, :as => :administrator
end

我正在使用具有以下能力设置的 cancan:

class Ability
include CanCan::Ability

def initialize(user)
if user
if user.administrator
can :manage, Channel
else
can [:read, :create], Channel
can [:update, :destroy], Channel, :course => false
end
end
end
end

这是我当前的 Controller 设置:

class ChannelsController < ApplicationController
load_and_authorize_resource

###

def new
end

def create
if @channel.save
redirect_to @channel, :notice => "Successfully created channel."
else
render :action => 'new'
end
end

def edit
end

def update
if @channel.update_attributes(params[:channel])
redirect_to @channel, :notice => "Successfully updated channel."
else
render :action => 'edit'
end
end

###

end

我需要在 Controller 中使用 cancan 的 load_and_authorize_resource 方法,以防止非管理员用户能够更新类(class)正确的现有 channel ,但我还需要使用 if 中断其资源加载/else 基于 current_user.administrator 设置 :as => :administrator 范围,以便管理员可以访问类(class)属性。

有没有明智的方法来做到这一点?

最佳答案

修复 update 方法非常简单,因为批量分配是由 update_attributes 完成的,而不是在 load_and_authorize_resource 中完成的:

def update
@channel.assign_attributes(params[:channel],
:as => (current_user.administrator ? :administrator : :default)
if @channel.save
redirect_to @channel, :notice => "Successfully updated channel."
else
render :action => 'edit'
end
end

对于 create 操作,我认为最简单的解决方案是手动进行分配和授权:

load_and_authorize_resource :except => :create

## ----

def create
@channel = Channel.new
@channel.assign_attributes(params[:channel],
:as => (current_user.administrator ? :administrator : :default)
if @channel.save
redirect_to @channel, :notice => "Successfully created channel."
else
render :action => 'new'
end
end

如果您最终经常这样做,那么使用简单的自定义过滤器而不是 load_and_authorize_resource 可能是值得的。

关于ruby-on-rails - 使用 cancan 时如何设置范围集中分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8942491/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com