所以我有一个文件找不到的问题.

这些文件都在本地虚拟应用程序的开发过程中可用,但由于正在编译的assets资源 ,最终的主机应用程序中没有这些文件.

我有一个rake任务,它获取数据,更新相关的部分内容,例如_横幅.SCS包含来自主题表的数据,但当然,由于引擎已经编译了部分内容,因此在主机应用程序中不可用.

引擎

require "deface"
require 'ccs_cms_admin_dashboard'
require 'ccs_cms_custom_page'
require 'ccs_cms_core'
require 'css_menu'
#require 'tinymce-rails'
require 'delayed_job_active_record'
require 'daemons'
require 'sprockets/railtie'
require 'sassc-rails'

module CcsCms
  module PublicTheme
    class Engine < ::Rails::Engine
      isolate_namespace CcsCms::PublicTheme
      paths["app/views"] << "app/views/ccs_cms/public_theme"

      initializer "ccs_cms.assets.precompile" do |app|
        app.config.assets.precompile += %w( public_theme_manifest.js )
      end

      initializer :append_migrations do |app|
        unless app.root.to_s.match?(root.to_s)
          config.paths['db/migrate'].expanded.each do |p|
            app.config.paths['db/migrate'] << p
          end
        end
      end

      initializer :active_job_setup do |app|
        app.config.active_job.queue_adapter = :delayed_job
      end

      config.to_prepare do
        Dir.glob(Engine.root.join("app", "decorators", "**", "*_decorator*.rb")) do |c|
          Rails.configuration.cache_classes ? require(c) : load(c)
        end
      end

      config.generators do |g|
        g.test_framework :rspec,
          fixtures: false,
          request: false,
          view_specs: false,
          helper_specs: false,
          controller_specs: false,
          routing_specs: false
        g.fixture_replacement :factory_bot
        g.factory_bot dir: 'spec/factories'
      end

    end
  end
end

编写Css的Css类

 class Css

  def get_stylesheet_path
    Rails.root.join("app/assets/stylesheets/ccs_cms/public_theme")
  end

  def write_css(theme)
    update_css_files_for(theme.banner, '_public_banner.scss', BANNER_ARRAY, BANNER_FIELD_MAP)
    update_css_files_for(theme.banner.font, '_public_banner_font.scss', BANNER_FONT_ARRAY, BANNER_FONT_FIELD_MAP)
  end

  private

    def update_css_files_for(model_record_to_use, css_file, array_to_use, field_map)
      amended_css = amend_css_for(model_record_to_use, css_file, array_to_use, field_map)
      create_css_files_for(css_file, amended_css)
    end

    def amend_css_for(model_record_to_use, file_name, array_to_use, field_map)
      original_css_array = IO.readlines("#{get_stylesheet_path}/#{file_name}")
      new_array = []
      original_css_array.each do |line|
        new_line = line
        array_to_use.each do |ma|
          if line.start_with?(ma)
            field_name = field_map[ma.to_sym]
            new_line = ma + ": #{model_record_to_use[field_name.to_sym]};"
            #puts("@@@@ original line: #{line}, ma: #{ma}, Field name: #{field_name}, value: #{theme[field_name]}")
            break
          end
        end
        new_array << new_line
      end
      new_array
    end

    # ---- File and I/O Handling ---- #

    def create_css_files_for(file_name, css_array)
      File.open("#{get_stylesheet_path}/#{file_name}", "w") do |file|
        file.puts css_array
      end
    end

end

推荐答案

谢谢你的澄清.如果我在这里理解正确的话,我对它的看法.

由于引擎已经编译了部分内容,因此在主机应用程序中不可用

部分仍然存在,预编译只会将*.{css/js}个文件输出到app/assets/config/manifest.js中声明的public/assets/个文件中.

要获取引擎文件,而不是Rails.root,请使用:

CcsCms::PublicTheme::Engine.root

例如,在Css班中:

def get_stylesheet_path
 CcsCms::PublicTheme::Engine.root.join("app/assets/stylesheets/ccs_cms/public_theme")
end

支持改变主题引擎.主题根可以在引擎初始值设定项中设置为Rails.configuration.theme_root左右,并在主应用程序中使用.

因为你的主题也是可配置的,我认为最好是读取主题的原始sass文件,但不要修改它们,将它们复制到tmp文件夹中,并使用主题表中的值进行更新,然后在主应用程序中使用sass输出theme.css.

​# Compiles all Sass
$ sass tmp/theme/application.scss:app/stylesheets/theme.css

然后让Rails接管预编译过程.

另一个选项是使用一个sass配置文件,只更新该文件.这样就不依赖于任何特定主题的文件 struct .

import 'configuration' // sass variables with values from theme table
import 'banner'        // uses sass variables only
...

如果可以 Select 的话,也只需使用css变量,并避免上述所有复杂性;没有预编译,主题表更改时没有重新部署.

Update表示css变量.

这样我们就在同一页了.我指的是这些css变量:

<!-- app/views/layouts/application.erb -->
<!-- NOTE: with turbo this loads only once; full page refresh is needed when @theme changes -->
<head>
  <style>
   :root { --text-color: <%= @theme.text_color %>; }
  </style>

  <%= stylesheet_link_tag 'application' %>
</head>
/* app/assets/stylesheets/application.css */
p { color: var(--text-color); }

可能的修复,以避免修改css文件.在sass文件中使用erb插值.无需每次更改主题配置时都进行修改.正在开发中的动态编译.在生产中,当主题配置发生变化时,它必须重新进行预编译;没有修正.

// _banner.scss.erb
p { color: <%= Theme.text_color %>; }

您甚至可以使用amend_css_for函数插入文字erb代码,从而节省一些时间.例如

new_line = ma + ": <%= Theme.#{model_name}.#{field_name} %>;" 

最后,如果您不想接触引擎文件,并且因为这些文件不是主/主机应用程序的一部分(就像文件系统中两个单独的文件夹一样).修改时必须复印一份;从CcsCms::PublicTheme::Engine.root读到Rails.root写.

def get_stylesheet_path
  CcsCms::PublicTheme::Engine.root.join("app/assets/stylesheets/ccs_cms/public_theme")
end

# but save to main app

def create_css_files_for(file_name, css_array)
  File.open("#{Rails.root.join("app/assets/stylesheets/ccs_cms/public_theme")}/#{file_name}", "w") do |file|
    file.puts css_array
  end
end

Css相关问答推荐

如何使搜索框扩展并溢出其他内容

可折叠/可展开的数据表行:如何使Shadcn数据表中的可折叠内容全宽?

如何将此 Select 器转换为TailWind类

在Reaction中自定义ANTD日期选取器

如何使用混合混合模式更改动画背景上的文本 colored颜色

如何使用来自单独模块的代码将自定义标头插入到使用 DT Shiny 呈现的表中?

Img 未拉伸以满足所需的纵横比

悬停时如何更改 navbarPage 链接的文本 colored颜色 (在shiny 的应用程序中)?

Flex & space-around 与内容相交

react 样式的条件类名称设置

CSS Slanding Div 边缘在图像上

停止 div 推动另一个 div 做出react

使用border-radius CSS时平滑边框

调整屏幕大小时无法让我的视频背景保持不变

iPhone X / 8 / 8 Plus CSS 媒体查询

谷歌浏览器两种元素样式的区别

当子元素水平溢出时,为什么忽略父元素的右填充?

如果容器 div 较小,如何将子 div 扩展到 100% 屏幕宽度?

CSS 外边框

CSS 边距和填充速记属性顺序的助记符