rake assets:没有数据库连接和动态路由的预编译

时间:2016-09-22 19:15:16

标签: ruby-on-rails ruby-on-rails-4 apartment-gem

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

我有两个限制:

  • 我无法连接到数据库(此步骤)
  • 我有一条动态路线,通常需要从数据库中获取信息(但这不是资产编译所必需的)

基本上我运行在生产环境之外构建的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

1 个答案:

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