gpt4 book ai didi

ruby-on-rails-3 - 如何将与 cancan 的祖先关系默认为树的内部节点?

转载 作者:行者123 更新时间:2023-12-04 20:12:23 29 4
gpt4 key购买 nike

我正在使用 cancan授权我的 Controller 操作。 cancan 授权访问的类之一是一棵树,用 acts_as_ancestry 实现。 .我在使用 load_and_authorize_resource 时遇到问题当不允许用户访问根级别,而是允许从内部节点开始访问时。

以下是一些相关的类定义:

class User < ActiveRecord::Base
belongs_to :organization, :inverse_of => :users
end

class Post < ActiveRecord::Base
belongs_to :organization, :inverse_of => :posts
end

class Organization < ActiveRecord::Base
has_ancestry :cache_depth => true
has_many :users, :inverse_of => :organization
has_many :posts, :inverse_of => :organization
end

管理帖子的规则是“您可以在您下属的任何组织中管理帖子”。我的康康能力定义是这样的:
class Ability
include CanCan::Ability

def initialize(user)
user ||= User.new

# subtree_ids is added by acts_as_ancestry
can :manage, Post, {:organization_id => user.organization.subtree_ids}
end
end

在 Controller 中,我有这个(省略了其他操作)
class PostsController < ApplicationController
load_and_authorize_resource :post

def index
end

def new
end
end

当授权用户属于根组织时,一切正常。但是,当我以在内部节点授权的用户身份登录时,索引操作工作正常,但是当调用新操作时,我收到 can-can 授权错误。

这是我在日志中看到的:
Access denied on new #<Post id: nil, organization_id: 1>
organization_id 1 (根)来自架构:
create_table "posts", :force => true do |t|
t.integer "organization_id", :default => 1
end

有了cancan,新 Action 将建立一个新的 Post并将其分配给 @post .执行此操作时,它将使用取自 can 的值初始化所有属性。 Abilities.rb 中的定义。但是,如果这些属性是数组、哈希或范围,并且默认值最终来自架构,则它不会做任何事情。

我如何授权用户管理其子树中的帖子,但当他们创建新帖子时,默认为他们的组织?

最佳答案

在cancan中,如果@post变量已经被你初始化了,它不会调用load_resource,只做授权部分。请参阅文档的这一部分:https://github.com/ryanb/cancan/wiki/Authorizing-controller-actions , “覆盖加载”。

因此,最简单的解决方案是自己控制初始化并使其符合您的需要,如下所示:

class PostsController < ApplicationController
before_filter :initialize_post, :only => [:new, :create]

def initialize_post
@post = current_user.organization.posts.build(params[:post]||{:name=>'Smashing Kittens'})
end

load_and_authorize_resource :post
def index
end

def new
end

def create
end
end

你可以看到它在我从你的帖子中创建的这个测试项目中工作: https://github.com/robmathews/cancan_test .

关于ruby-on-rails-3 - 如何将与 cancan 的祖先关系默认为树的内部节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15696564/

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