gpt4 book ai didi

ruby-on-rails - 这个传递给 Devise 的认证方法的 lambda 函数是如何工作的?

转载 作者:数据小太阳 更新时间:2023-10-29 07:31:55 26 4
gpt4 key购买 nike

this问题,@user2205763 建议使用 lambda 函数:

authenticated :user, lambda {|u| u.is_test } do
// route stuff here
end

我假设它以某种方式将 :user 转换为实际的 Devise User 对象 (u) 但是它是怎么做到的 - 它实际上在做什么?

最佳答案

Rails 允许在路由定义中使用 constraints 根据一组规则来约束路由。查看Dynamic request matching API 文档中的示例。

Devise 在其 authenticated 方法中使用它。来源是 here .

authenticated 方法如下所示:

def authenticated(scope=nil, block=nil)
constraints_for(:authenticate?, scope, block) do
yield
end
end

并且正在调用constraints_for:

def constraints_for(method_to_apply, scope=nil, block=nil)
constraint = lambda do |request|
request.env['warden'].send(method_to_apply, scope: scope) &&
(block.nil? || block.call(request.env["warden"].user(scope)))
end

constraints(constraint) do
yield
end
end

所以 scope:usermethod_to_apply:authenticate?request.env[ "warden"] 是一个对象 injected into the environment by Warden允许您检查身份验证。

这意味着 constraint = ... 正在创建一个调用 authenticate? 的 lambda,然后调用您的 block ,例如|你| u.is_testu 设置为 request.env["warden"].user 的结果(即 authenticate 之后的当前用户? 已调用)

然后,该 lambda 作为匹配 constraints 的动态请求传递,这反过来会产生 //route stuff here 所在的 block !

关于ruby-on-rails - 这个传递给 Devise 的认证方法的 lambda 函数是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29133057/

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