我一直在从2.3.11升级到Rails 3.1 . 要清除的主要障碍之一是转换为资产管道 . 在这个过程中,我决定将我的CSS转换为sass(scss) . 在rails 3.1中,通过管道传递的所有资产都会在 生产环境 中接收附加到文件名的哈希值 . 因此,我的css中引用的所有图像现在都需要在sass中使用image-path或image-url helpers . 问题是,即使我在我的environment.rb文件中设置了我的ENV ['RAILS_RELATIVE_URL_ROOT'],sass资产助手也无法包含relative_url_root .
为了清楚起见,要在rails 3.1中添加relative_url_root,我将以下行添加到我的environment.rb文件中:
ENV['RAILS_RELATIVE_URL_ROOT'] = '/foo'
并将以下行添加到我的虚拟主机:
RailsBaseURI /foo
这种策略似乎适用于所有链接等 . 只是sass中的资产助手似乎没有正常工作 . 任何想法,将不胜感激 .
1 回答
经过一番挖掘后,我发现了这个问题 . 问题出在Rails中,特别是Sprockets :: Helpers :: RailsHelper :: AssetPaths#compute_public_path . Sprockets :: Helpers :: RailsHelper :: AssetPaths继承自ActionView :: AssetPaths并覆盖了许多方法 . 当通过Sass :: Rails :: Resolver调用compute_public_path #sublic_path方法是sass-rails时,rails sprocket helper接受解析资产的任务 . Sprockets :: Helpers :: RailsHelper :: AssetPaths#compute_public_path遵循super,即ActionView :: AssetPaths#compute_public_path . 在这种方法中有一个has_request的条件?在rewrite_relative_url_root上,如下所示:
如果查看rewrite_relative_url_root的内部,它依赖于存在的请求以及从控制器变量派生它以解析相对url根的能力 . 问题是,当sprockets为sass解析这些资产时,它没有控制器,因此没有请求 .
上面的解决方案对我来说在开发模式下不起作用 . 这是我现在使用的解决方案: