仅为Rails中的一个文件进行实时资源编译

时间:2013-02-21 18:36:06

标签: ruby-on-rails ruby assets precompile

config.assets.compile = true 参数,可以启用所谓的“实时编译”。 我需要Rails在实时模式下为每个请求编译一个特定资产(sample.css.scss.erb),但其余资产仍应预编译。 我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

选项1 - 将sample.css.scss.erb放在与config.assets.manifest (default="public/assets")不同的路径中,并将其添加到javascript_include_tag

选项2 - 从config.assets.precompile

中删除它
config.assets.precompile -= %w( sample.css.scss.erb )

确保清理然后预编译以进行测试。

我没有测试任何一个选项,请告诉我们是否适用于您。

答案 1 :(得分:0)

.css.erb文件预处理css时,需要对文件进行实时编译。 这意味着动态编译css。

例如:允许用户设置颜色并希望有条件地使用"实时编译"

在这种情况下,我建议动态渲染/users/:id/styles.css.erb而不是实时编译。

原因可能是数百万用户和使用Ec2实例的生产环境会花费更多。这就是为什么我会建议以下解决方案:

首先在UsersController上定义自定义操作:

# config/routes.rb
match '/users/:id/styles' => 'users#styles', :as => :user_styles

链接到"样式表"在你的布局中:

# app/views/layouts/application.html.erb
= stylesheet_link_tag 'application', user_styles_path(current_user, :format => 'css')

在控制器中定义操作。您可以在此处执行任何操作来检索用户的首选项:

# app/controllers/users_controller.rb
class UsersController < ApplicationController
  def styles
    @colors = User.find(params[:id]).colors
  end
end

该操作将自动呈现此视图:

# app/views/users/styles.css.scss.erb
$background-color: <%= @colors[:background] %>;

body {
  background-color: $background-color;
}

非常欢迎更多的想法和建议。