2016-09-22 74 views
0

我试图编译我的资产进行生产,这不是在本地完成的。rake资产:没有数据库连接和动态路由的预编译

我有2个约束:

  • 我无法连接到数据库(此步骤)
  • 我有一个通常需要从数据库获取信息动态路由(但它没有必要为资产编译)

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

但现在我有一个动态的路线:

scope path: ":tenant", constraints: {tenant: Apartment.tenant_names.join('|')} do 
    .... 
end 

这是工作,因为我重新加载路由时增加了一个新的房客名字。

但是,当我必须编译资产失败,因为编译初始化应用程序和路线试图做Apartment.tenant_names.join('|')这将明显失败,没有数据库连接。

如果我用字符串替换Apartment.tenant_names.join('|'),则db不会被调用,并且编译运行良好。

有什么我可以用它来查看是否编译步骤,试图给init程序,并作出条件做这样的事情:

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

以这种方式动态定义路线的目的是什么?在我看来,你正在做虚荣路线这样的错误。 – max

+0

我知道routes.rb中的动态元素不是“导轨方式”。这更多的是关于这是否可能的问题。为什么我问这是因为没有子域名的多租户应用程序工作。我不希望与非租户有关的请求落入公共shema中。这就是为什么我的约束是有用的,所以我可以抓住不相关的租户请求并正确地路由它们。我将在Apartment Github上公开一个问题。 –

+0

@max我设置了一个可以解决错误的解决方法,它对于路由来说更干净。 –

回答

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调用。但正如我所说,你可能需要调整正则表达式。

+0

感谢您的回答,我会尽快对其进行测试! –

+0

caller.to_s返回太多元素,过滤它们以获得预编译:没有误报的资产将很难。目前我会牢记这一点。 –