我承认这在开发中更容易产生麻烦,并且在生产中不那么麻烦,但即使在生产中,我也不希望设计为/assets
请求进行身份验证或添加任何开销。< / p>
在开发过程中,我们看到了大量以下内容(目前每个资产文件大约有30个):
Started GET "/assets/application.js?body=1" for 127.0.0.1 at 2015-09-01 11:53:40 -0500
AfCore::User Load (0.1ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 8 ORDER BY `users`.`id` ASC LIMIT 1
我查了一下,找不到与跳过资产相关的任何选项,我没有看到我们明确添加它们的位置,除非protect_from_forgery with: :exception
之类的内容导致这种情况。
我们如何设计跳过所有资产请求?
答案 0 :(得分:1)
我碰巧有权访问源代码,它与机架组件有关。在机架组件中调用warden.user是基于请求的,并将针对每个请求查询用户。以下是用于诊断的代码:
puts 'before warden.user'
if warden.presence && warden.user.presence
security_context.user = warden.user
end
puts 'after warden.user'
和控制台输出:
before warden.user
User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 3 ORDER BY `users`.`id` ASC LIMIT 1
after warden.user
***** EDIT *****
可以跳过:
def call(rack_env)
if rack_env['PATH_INFO'] =~ /^\/assets/
# avoid retrieving the session's user for unnecessary calls - assets/validators
@app.call(rack_env)
else
...
# warden.user stuff
...
@app.call(rack_env)
end