如何将资源编译为图像,样式表和javascript目录?

时间:2017-03-11 20:45:43

标签: ruby-on-rails asset-pipeline

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

有没有办法将它们复制到/ public / assets / images,public / assets / stylesheets以及public / assets / javascripts?

引起混淆的是导轨指南中的这一行:

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

  

在常规视图中,您可以访问public / assets / images目录中的图像,如下所示:

但是rails并没有使用或制作公共/资产/图像目录。

1 个答案:

答案 0 :(得分:0)

解决方案#1:

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

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的{​​{1}}来电正在返回 资产文件夹中的所有子目录,因此没有 当Sprocket计算其消化时,*paths["app/assets"]文件夹中的子目录 资产。

为了重新添加这些子目录,我们必须修改当前 Rails为Sprockets配置了环境;即 public/assets。但是,Rails.application.config.configure就是这样 包含在Sprockets::PathsSprockets::Configuration收益率不允许公开访问 它的内部Rails.application.config.configure变量,也没有删除路径的方法 它通过@paths添加路径。相反,我们必须复制 已经包含在上面的Railtie初始化程序块中的当前路径,删除 我们不想要的旧append_paths子目录路径,只添加 我们想要的"app/assets"目录,然后将它们追加到已配置的目录中 链轮环境;在Rails初始化程序中看起来像这样:

"app/assets"

结束评论

使用这些解决方案中的任何一个也意味着您需要在所有的子目录中指定子目录 在您的视图模板中调用# 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 方法以便查找 编制资产; e.g。

asset_path

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