我正在尝试编译我的资产以进行生产,这不是在本地完成的。
我有两个限制:
基本上我运行在生产环境之外构建的docker镜像。我无法连接数据库。我通过直接在dockerfile中传递带有env_var的虚假db地址来使用技巧。
但现在我有一条动态路线:
scope path: ":tenant", constraints: {tenant: Apartment.tenant_names.join('|')} do
....
end
这是有效的,因为我在添加新租户名称时重新加载路由。
但是当我必须编译它失败的资产时,因为编译初始化应用程序和路由尝试执行Apartment.tenant_names.join('|')
,如果没有数据库连接,这显然会失败。
如果我用字符串替换Apartment.tenant_names.join('|')
,则不会调用db并且编译运行正常。
我是否可以使用某些内容来查看编译步骤是否正在尝试启动应用程序并创建条件来执行以下操作:
if assets_are_compiling?
scope path: ":tenant", constraints: {tenant: "assets_compiling"} do
....
else
scope path: ":tenant", constraints: {tenant: Apartment.tenant_names.join('|')} do
....
end
有什么想法吗?
编辑:解决方法
这不是问题的解决方案,但这是一个未来参考的解决方法。显然使用lambda并没有触发编译错误:
scope path: ":tenant", constraints: lambda {|request| (Apartment.tenant_names.include?(request.path.split('/')[1])) } do
答案 0 :(得分:1)
这应该可行,但您可能需要调整正则表达式,以便其他任务不会触发误报。
if caller.to_s.match(/\/bin\/rake:\d+/) and caller.to_s.match(/\/lib\/sprockets\/rails\/task\.rb:\d+/)
scope path: ":tenant", constraints: {tenant: "assets_compiling"} do
...
end
else
scope path: ":tenant", constraints: {tenant: Apartment.tenant_names.join('|')} do
...
end
end
此代码基本上是执行堆栈跟踪以查看它是否是从rake assets:precompile
调用的。但就像我说的,你可能需要调整正则表达式。