使用Ruby 3、rails 7+和Scarkets V4时,我在编译gem中的cssassets资源 时遇到了麻烦.

我已经创建了一个gem(作为Rails引擎),它包含一些app/assets/stylesheets/my_gem中的.cssassets资源 (请注意,该目录位于my_gem项目中,而不是主Rails应用程序中),并且它还有一个app/assets/config/my_gem_manifest.js文件,其中包含我需要的实际.css文件.

我可以将my_gem个资源用于主Rail应用程序的唯一方法是显式设置gem的路径,并在主Rail应用程序的加载路径上手动添加css文件,如下所示:

(在主应用程序application.rb上)

config.assets.paths << '/usr/local/bundle/gems/my_gem-0.1.7/app/assets/stylesheets/my_gem'

通过这样做,我实际上可以毫无错误地使用我的css,但我的目标是只添加"my_gem"的S list 文件,并拥有链轮来实际编译gem的cssassets资源 ,并使其可用于主Rails应用程序.

我还try 手动添加gem的manifest文件所在的目录,甚至try 将manifest文件添加到主应用程序的预编译列表中,但没有成功,就像这样:

config.assets.paths << '/usr/local/bundle/gems/my_gem-0.1.7/app/assets/config'
config.assets.precompile << "my_gem_manifest.js"

好几天都在和这件事作斗争!如果有任何帮助,我很感激.谢谢.

推荐答案

铁轨::铁道

设置:

bin/rails plugin new my_gem
# my_gem/lib/my_gem/railtie.rb

module MyGem
  class Railtie < ::铁轨::铁道
    def root
      @root ||= Pathname.new(__dir__).parent.parent
    end

    initializer :my_gem_assets do |app|
      # This is to be able to require your styles from main app application.css
      # like this:
      #
      #   /* =require my_gem/application.css */
      #
      app.config.assets.paths << root.join("app/assets/stylesheets")

      # This is to be able to directly link your styles from your templates:
      #
      #   <%= stylesheet_link_tag "my_gem/application.css" %>
      #
      # this path is relative to any `app.config.assets.paths`
      app.config.assets.precompile << "my_gem/application.css"
    end
  end
end

如果您要使用MANIFEST:

# my_gem/lib/my_gem/railtie.rb

module MyGem
  class Railtie < ::铁轨::铁道
    def root
      @root ||= Pathname.new(__dir__).parent.parent
    end

    initializer :my_gem_assets do |app|
      app.config.assets.paths << root.join("app/assets/stylesheets")
      app.config.assets.paths << root.join("app/assets/config") # <-----------------------.
      app.config.assets.precompile << "my_gem_manifest.js"      # relative to asset path -'
    end
  end
end
// my_gem/app/assets/config/my_gem_manifest.js

//= link my_gem/application.css

100


Rails::Engine

设置:

bin/rails plugin new my_engine --mountable

与铁路公司不同的是,Engine为你处理了很多事情:

# my_engine/lib/my_engine/engine.rb

module MyEngine
  class Engine < ::Rails::Engine
    isolate_namespace MyEngine

    initializer :my_engine_assets do |app|
      # This is automatically done by Rails::Engine
      # app.config.assets.paths << root.join("app/assets/stylesheets")
      # so you can just require files without extra config
      #
      #   /* =require my_engine/application.css */

      # If you want to link directly:
      #
      #   <%= stylesheet_link_tag "my_engine/application.css" %>
      #
      # add that file to be precompiled
      # app.config.assets.precompile << "my_engine/application.css"
      #
      # or use manifest
      # ('app/assets/config' is automatically added to assets paths)
      app.config.assets.precompile << "my_engine_manifest.js"
    end
  end
end
// my_engine/app/assets/config/my_engine_manifest.js

//= link_directory ../stylesheets/my_engine .css

主应用程序

现在,您可以从主应用程序使用您的gem/Engine资源:

# app/views/layouts/application.html.erb

# we can do this because these files are in
# Rails.application.config.assets.paths and
# Rails.application.config.assets.precompile
<%= stylesheet_link_tag "my_gem/application.css" %>
<%= stylesheet_link_tag "my_engine/application.css" %>

或者,您可以要求主应用程序application.css中的文件:

/* app/assets/stylesheets/application.css */

/* in this case you don't have to precompile them
 * =require my_gem/application.css
 * =require my_engine/application.css
 */

Ruby-on-rails相关问答推荐

Rails 7.1.3如何在生产环境中查看堆栈跟踪

轨道强参数,怎么允许空参数?

如何从 Rails7.2 中的控制器获取名称空间?

如何从数组中提取值

URL 中的 Rails slugs - 使用 Active Record Model Post 的 Title 属性而不是 ID

如何将动态 Ruby 代码嵌入到 Slim 模板中的javascript部分?

如何判断是否已经在 ruby​​ on rails 的数据库事务中?

在 Epoch 中将 Ruby 时间戳转换为秒数并返回

在 Rails/ActiveRecord 列名中使用问号字符

如何找出现有 Rails 应用程序基于哪个 Rails 版本?

Rspec/Capybara 正在加载,循环要求被认为是有害的

Rails:使用 link_to 创建不带 href 的链接

如何在特定时区(最好是我的应用程序的默认时区,而不是 UTC)中创建新的 DateTime 对象?

rails 4 before_validation on: :create 或 on: :save

用户注册时设计确认令牌无效

Rails 3 返回 HTTP 406 Not Acceptable?

如何一次显示一条 Ruby on Rails 表单验证错误消息?

Heroku - 在浏览器中显示当前提交的哈希

您可以在弹性 beantalk 环境中运行 rails 控制台或 rake 命令吗?

rails路由中资源和资源之间的区别?