2014-03-19 113 views
2

我有一个动态创建和编译自视资产Rails应用程序的网域,您访问的网站(让说不同的颜色,其中的颜色值存储在数据库)如何判断产生新的公共资源文件的Rails资产

让的说了www.hello.example就会产生public/assets/hello-application-52777d36dec6f6e311560156da9da1c2.css所以浏览器的源文件将指向

layout: 
= stylesheet_link_tag 'hello-application' 

generated html: 
<link href="/assets/hello-application-52777d36dec6f6e311560156da9da1c2.css" media="all" rel="stylesheet" /> 

如果添加www.goodbye.example它将编译public/assets/goodbye-application-52777d36dec6f6e311560156da9da1c2.css所以浏览器的源文件将指向

layout: 
= stylesheet_link_tag 'goodbye-application' 

generated html: 
<link data-turbolinks-track="true" href="/assets/goodbye-application-52777d36dec6f6e311560156da9da1c2.css" media="all" rel="stylesheet" /> 

资产都在运行正确编译而不需要重新启动服务器。上述做工精细

例子,如果我重新启动服务器

我想不通的事情是如何告诉新的公共资源文件生成导轨,使其= stylesheet_link_tag 'goodbye-application'将它捡起来,而无需重新启动生产服务器

我的猜测是,它有事情做,以告诉Rails重新加载public/manifest.json我只是无法弄清楚

  • 的Rails 4.0.2
  • 红宝石2.1
  • 独角兽生产服务器

我的功能有点类似,但是krautcomputing article他与“消化”,这是不是为轨道4,5工作solwing这个问题(+它不久将被取消)


更新

一个纨绔子弟提供一个答案(他不得不删除)建议我不必这样做,因为独角兽具有零时间重新启动,这样我就可以重新启动麒麟,它将加载新的公共财产......这是真的,我这样做是这样,我已经问过这个问题之前。不过,我正在寻找避免这种情况的解决方案。 (让用户说产生每天1000款)

他还建议使用咕噜...嗯,这是B计划,我真的不知道是否有一种方法在Rails的链轮要做到这一点:)

+0

Rails现在如何做到这一点?您现在使用什么配置来完成即时生成? – phoet

+1

另外:您应该尽快从rails v4.0.2升级到最新的v4.0版本。 [v4.0.3](http://weblog.rubyonrails.org/2014/2/18/Rails_3_2_17_4_0_3_and_4_1_0_beta2_have_been_released /)引入了多个安全补丁。 – fny

+0

根据将要生成的CSS名称,如何制作'= stylesheet_link_tag'变量''。 例如,再见一个会有goodbye.css,另一个会有你选择的名字? – 0bserver07

回答

1

为什么不推出自己的辅助方法?

def subdomain_application_stylesheet_link_tag(subdomain) 
    if Rails.env.production? 
    # This assumes you've precompiled the spreadsheet into the public directory via sprockets 
    stylesheet_link_tag File.basename(
     Dir.glob("#{Rails.root}/public/assets/#{subdomain}-application-*.css").first 
    ) 
    else 
    # Logic to development stylesheet selection 
    end 
end 
0

以下是清单重装问题的完整解决方案。由于在原来的职位说明,新的manifest.json你动态生成不会重新加载,除非你完全刷新你的服务器(或杀死的作品,等等)。只是重申:

如果要动态地创建资产“活”,具有明显 一起以防止缓存,链轮不重装 请求之间的清单。

我需要这种清单重载能力,因为我正在使用Gulp来滚动自己的资产管道以提高性能。基本上,使用这种解决方案可以让资产在生产过程中正确运行,同时在使用新清单进行开发时仍能够重新加载它们......非常漂亮,我希望您发现它适合您的生产需求。

创建文件的配置/初始化/活manifest.rb:

require 'sprockets/rails/helper' 
    module Sprockets 
    module Rails 
     module Helper 
     def asset_digest_path(path, options = {}) 
      # create the new manifest, overriding sprockets' old one 
      if assets_manifest and manifest = Sprockets::Manifest.new(assets, Dir.glob(File.join(assets_manifest.dir, 'manifest-*.json')).first) 
      if digest_path = manifest.assets[path] 
       return digest_path 
      end 
      end 

      if environment = assets_environment 
      if asset = environment[path] 
       return asset.digest_path 
      end 
      end 
     end 
     end 
    end 
    end 

而且,你比欢迎,如果你希望自定义新的清单目录的更多。 Mine与前一个位置相同,使用不同的名称,正如您从Dir.glob方法调用中看到的那样。

相关问题