如何将资产编译到图像、样式表和 javascript 目录中?

How can I have assets compiled into image, stylesheet, and javascript directories?

资产管道将所有内容放入同一目录。图像、样式表和 javascript 都进入 /public/assets(尽管子目录受到尊重)。

有没有办法将它们复制到 /public/assets/images、public/assets/stylesheets 和 public/assets/javascripts 中?

更令人困惑的是 rails 指南中的这一行:

http://guides.rubyonrails.org/asset_pipeline.html#coding-links-to-assets

In regular views you can access images in the public/assets/images directory like this:

但是 rails 不使用或创建 public/assets/images 目录。

解决方案 #1:

app/assets/ 中创建一个新的子目录,如 all 并移动 当前资产目录到新文件夹中;例如

mkdir -p app/assets/all
mv app/assets/{javascripts,images,stylesheets} app/assets/all/

然后在使用 RAILS_ENV=production rails assets:precompile 预编译资产时 它应该创建那些 javascriptsimagesstylesheets 目录 在 public/assets 目录下;

public/assets/javascripts
public/assets/images
public/assets/stylesheets

解决方案 #2:

您可以在项目的其他地方创建一个新目录;喜欢 assets, 而不是 app/assets;并将新目录添加到当前 Rails assets.rb 初始值设定项

中的资产路径配置
# app/config/initializers/assets.rb
Rails.application.config.assets.paths << Rails.application.root.join("assets")

然后预编译资产应该与解决方案#1.

具有相同的效果

解决方案 #3

因此,作为 Sprocket-Rails 引擎的一部分,它会预加载 app/assets 具有以下代码块的子目录:

# ~/ruby/gems/2.3.0/gems/sprockets-rails-3.2.0/lib/sprockets/railtie.rb:54
module Rails
  # [...]

  class Engine < Railtie
    # Skip defining append_assets_path on Rails <= 4.2
    unless initializers.find { |init| init.name == :append_assets_path }
      initializer :append_assets_path, :group => :all do |app|
        app.config.assets.paths.unshift(*paths["vendor/assets"].existent_directories)
        app.config.assets.paths.unshift(*paths["lib/assets"].existent_directories)
        app.config.assets.paths.unshift(*paths["app/assets"].existent_directories)
      end
    end
  end
end

兴趣线是

app.config.assets.paths.unshift(*paths["app/assets"].existent_directories)

它调用 existent_directories 关闭 *paths["app/assets"] 正在返回 资产文件夹中的所有子目录,因此为什么没有 public/assets 文件夹中的子目录,当 Sprocket 计算其摘要时 资产。

为了重新添加那些子目录,我们必须修改当前的 Rails Sprockets 的配置环境; IE。 Rails.application.config.configure。但是,Sprockets::Paths 即 包含在 Sprockets::ConfigurationRails.application.config.configure 屈服于不允许 public 访问 它的内部 @paths 变量,也没有删除路径的方法 它确实通过其 append_paths 添加路径。相反,我们必须复制 上面的 Railtie 初始化块已经包含的当前路径,删除 我们不需要的旧 "app/assets" 子目录路径,只需添加 "app/assets" 我们确实需要的目录,然后将它们追加回配置的 链轮环境;在 Rails 初始值设定项中看起来像这样:

# app/config/initializers/assets.rb
Rails.application.config.assets.configure do |env|
  old_paths = env.paths.dup
  new_paths = old_paths - Rails.application.paths["app/assets"].existent_directories
  new_paths << Rails.application.root.join("app", "assets")

  env.clear_paths
  new_paths.each { |path| env.append_path(path) }
end

结束评论

使用这些解决方案中的任何一个也意味着您将需要在所有文件中指定子目录 asset_path 在您的视图模板中调用方法以找到 编译资产;例如

<%= asset_path "images/example.png" %>
<%= asset_path "javascripts/application.js" %>
<%= asset_path "stylesheets/application.css" %>

/assets/images/example-ca63e56ac855bdfb187479a35a7476cd65c539727f84fea19e1ad258cf3d23f5.png
/assets/javascripts/application-a4f3e75c7f7aa6d6cbc2ebcbb436b12aca442553219883805baebdd2eecd5471.js
/assets/stylesheets/application-539757f75200b6ea43399bf5e25cbc2819c1e6a610f94d5c9beaf91fec89384e.css

我希望这些解决方案对您有所帮助。