gpt4 book ai didi

ruby-on-rails - 可以解释load_and_authorize_resource

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

我怎么知道load_and_authorize_resource在里面工作。
我搜索了github页面Link并试图理解,但我没有发现任何有用的东西。我只知道load_and_authorize_resource就像一个before_filter,它加载(以某种方式)我们在ability.rb中编写的能力

我会更好地知道这是怎么可能的。我的意思是,我不想研究所有的 gem,但我只想看看如何在 Controller 中加载资源的能力,如果 load_and_authorize_resource真的是一种before_filter。

最佳答案

免责声明 : 为简单起见,我有意省略了一些对短内部方法的调用。完整调用链可通过关注load_and_authorize_resource获取方法定义等。

如文档中所述,load_and_authorize_resource设置before_filter ...

# cancan/lib/cancan/controller_additions.rb
def load_and_authorize_resource(*args)
cancan_resource_class.add_before_filter(self, :load_and_authorize_resource, *args)
end

...调用两个方法: load_resourceauthorize_resource .
# cancan/lib/cancan/controller_resource.rb
def load_and_authorize_resource
load_resource
authorize_resource
end

为了了解他们的行为,我们将仔细研究他们两个。

基于 params传递给您的 Controller 操作的哈希值, load_resource决定是否应该获取类的新实例(例如 Post.new )或 find基于 params[:id] 的特定实例(例如 Post.find(params[:id]) )。该实例(或诸如 index 之类的操作的实例集合)被分配给您的 Controller 操作的相应实例变量。
# cancan/lib/cancan/controller_resource.rb
def load_resource
unless skip?(:load)
if load_instance?
# here you have obtained your object, e.g. Post with id=5
# and placed it into cancan resource_instance variable.
# it has automatically set up @post instance variable for you
# in your action
self.resource_instance ||= load_resource_instance
elsif load_collection?
self.collection_instance ||= load_collection
end
end
end

稍后, authorize_resource被调用。您应该熟悉它的内部逻辑语法:手动检查能力看起来与此方法内部发生的事情相同。基本上你拿一个 resource_instance在上一步中获得, params[:action]这是当前操作的名称,并检查是否可以访问给定对象的特定操作。
# cancan/lib/cancan/controller_resource.rb
def authorize_resource
unless skip?(:authorize)
# similar to what happens when you call authorize!(:show, @post)
@controller.authorize!(authorization_action, resource_instance || resource_class_with_parent)
end
end

只要在 before_filter 内引发异常停止执行 Controller 操作,此处未通过授权会使您重定向到应用程序的主页 url,显示 500 错误页面或您为 CanCan::AccessDenied 定义的任何行为处理。

另一方面,如果您已成功通过授权,您的操作代码将被执行。现在您可以访问由 @post 设置的实例变量(例如 CanCan )在 load_resource步。

关于ruby-on-rails - 可以解释load_and_authorize_resource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30840231/

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