2016-07-07 41 views
0

新手入门(使用了3周)。我有几个视图和他们对应的scss文件。即使页面不需要特定的样式表,为什么rails会加载所有的css文件?

例如,

浏览

view1.html.erb 
view2.html.erb 
view3.html.erb 


样式表

view1.scss 
view2.scss 
view3.scss 

当我加载view1.html里面的<head>页面里的所有三个样式表文件都被加载了(现在我其实现在需要view2.cssview3.css)。

背后有原因吗?为什么不只是加载当前页面需要的静态文件?例如,仅在页面view1.html中加载view1.css

我知道在生产环境中所有这些将被合并成一个单一的文件。那是因为所有这些静态资产都会被浏览器缓存,因此第一次加载单个文件会使后续访问快得多?

我问这个问题的原因是因为我只想在页面中包含控制器特定的样式表。我试过下面的代码,但是会导致non ppreprocess error

<%= javascript_include_tag params[:controller] %> 
<%= stylesheet_link_tag params[:controller] %> 

我仍然在以下链接阅读文档,

http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets

感谢您的时间观看的问题。

回答

4

您可以尝试实现,通过这种方式,

如果您生成一个名为Userscontroller 控制器的Rails在app/assets/javascripts/users.js.coffee,另一个在app/assets/stylesheets/users.css.scss增加了新的文件。 你应该把任何JavaScript或CSS独特各自的资源文件里面的控制器,因为这些文件就只是这些控制器用线如

<%= javascript_include_tag params[:controller] %> or <%= stylesheet_link_tag params[:controller] %>

首先被加载,禁用所有的默认加载样式表通过删除application.css清单中的任何额外要求。

*= require_tree .

删除此行或更改,

* require_tree . // removed '='

告诉Rails编译我们的控制器资产

默认情况下,该资产管道只编译application.js/.css任何文件,他们需要。因为我们删除了require_tree。指令,我们需要告诉Rails关于我们特定于控制器的资产,否则他们不会被编译。

创建一个名为config/initializers/assets.rb一个新的初始化文件,(用自己更换控制器名)增加以下内容:

%w(controller_one controller_two controller_three).each do |controller| 
    Rails.application.config.assets.precompile += ["#{controller}.js.coffee", "#{controller}.css.scss"] 
end 

注意:您也可以在css.scss重命名为CSS。

Check this link for details

+0

稍后我会尝试这个2小时。谢了哥们。 –

+0

没问题的队友。 :) – Sravan

+0

问题解决了,谢谢@Sravan。 :d –

0

显式声明的所有控制器都让我感觉不好,因此,我们替换@Sravan的解决方案,下面的代码,

Rails.application.config.assets.precompile << /(^[^_\/]|\/[^_])[^\/]*$/ 
Rails.application.config.assets.precompile += ["*.js.es6", "*.scss"] 
相关问题