【问题标题】:Dynamic precompile assets on production生产中的动态预编译资产
【发布时间】:2017-08-07 10:46:54
【问题描述】:

我们在代码中使用 css.scss.erb 文件。对 de 模型的此文件访问对每个循环进行迭代以创建 css 文件。有时我们需要重做文件(当模型改变时)。

**stylesheets/utils/_comunicaciones.css.scss.erb**

   <%Producto.all.each do |img| %>
    <%unless img.portada.blank?%>
    ##{$id}--<%=img.id%> {

        &:before {
            background: url('<%= img.portada.url(:icon_lands) %>');

            background-position: $bg-position;
            background-size: $bg-size;
            background-repeat: $bg-repeat;
        }
    }
    <%end%>
    <%end%>

为此,我们在 config/initializers/assets.rb 中放置了一个 config.assets.precompile 行。

Rails.application.config.assets.precompile += %w( stylesheets/utils/_comunicaciones.css.scss.erb )
Rails.application.config.assets.precompile += %w( '*.css.scss.erb' )

为了让它在开发模式下工作,我们在模型变化时关注文件的变化。

class  ProductoImagen < ActiveRecord::Base
before_save  :precompilar
belongs_to :producto

    def precompilar
  fichero =  File.read('app/assets/stylesheets/utils/_comunicaciones.css.scss.erb').split('/* #=cambios')[0].to_s + '/*' + " #=cambios " + Time.now.to_s + '*/'
  File.open('app/assets/stylesheets/utils/_comunicaciones.css.scss.erb','w') {|f| f.write(fichero)}
  #Rails.application.load_tasks
  #Rake::Task['assets:precompile'].invoke
end

我应该怎么做才能在生产模式下更改文件? 如何重新预编译文件并下次重新加载应用程序?

【问题讨论】:

  • 预编译的资产应该保持原样;预编译(未重新编译)。由于可能的不一致(在写入时读取),强制资产编译和运行时不是一个好主意(也不是一个好的做法)。您可能应该将它们放在视图中,这些视图在运行时编译和提供。您也可以使用Rails cache
  • 好的,只有在de管理工作时才重新编译。在几次。感谢您对问题的看法。但是有可能做到吗?
  • 我不确定资产管道是否可以在运行时访问。您可能希望创建一个新控制器来提供这些文件,并按需预编译它们。

标签: ruby-on-rails sass asset-pipeline erb sprockets


【解决方案1】:

没有必要预编译你想要的东西。只需在您的 html 中嵌入样式:

<html>
  <head>
    <!-- some static styles -->
    <link rel="stylesheet" href="/application.css">

    <!-- dynamic styles -->
    <style>
        <%Producto.all.each do |img| %>
            ##{$id}--<%=img.id%> {
                background: url('<%= img.portada.url(:icon_lands) %>');
                background-position: $bg-position;
                background-size: $bg-size;
                background-repeat: $bg-repeat;
            }
        }
        <%end%>
    </style>
  </head>

  <body>
      <!-- some html -->
  </body>
</html>

当然,最好把这段代码粘贴到partial或者helper中。

【讨论】:

  • 是的,我知道这个选项。但我认为最好把代码和样式分开。
猜你喜欢
  • 1970-01-01
  • 2016-10-14
  • 2013-05-08
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多