0

我正在尝试编译我的资产以进行生产,这不是在本地完成的。

我有两个限制:

  • 我无法连接到数据库(对于这一步)
  • 我有一个动态路由,通常需要从数据库获取信息(但资产编译不需要)

基本上,我在生产环境之外构建的 docker 映像上运行。我无法连接数据库。我通过在 dockerfile 中直接传递带有 env_var 的虚假数据库地址来使用技巧。

但现在我有一条动态路线:

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
4

1 回答 1

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. 但就像我说的,您可能需要调整正则表达式。

于 2016-09-22T19:47:58.750 回答