我正在构建一个使用 zurb-foundation 样式表的 Rails 引擎,并且不断遇到相同的 Sass::Syntax 错误。这看起来很奇怪,因为我在 Rails 应用程序中遵循了相同的过程,并且在第一次尝试时就成功了。因此,我决定通过启动两个新的 Rails 项目(一个应用程序和一个引擎)将问题归零,并将它们配置为使用 Foundation 并进行最少的设置。
我从 2 个干净的 Rails 3.2.9 项目开始——一个应用程序和一个 engine --full
并通过添加 foundation_and_overrides.scss 和 require
为基础手动配置它们>-ing 在 CSS list 中。
然后我创建了一个基本的 Controller ,这样我就可以加载一个页面。对于应用程序,加载该页面并查看页面源代码,我可以看到基础 CSS 已正确编译并加载。
当我对引擎尝试同样的操作时,出现了这个错误:
Sass::SyntaxError in Main#index
Showing /<PLUGIN_PATH>/test/dummy/app/views/layouts/application.html.erb where line #5 raised:
File to import not found or unreadable: foundation/common/ratios.
Load path: /<PLUGIN_PATH>/test/dummy
(in /<PLUGIN_PATH>/app/assets/stylesheets/example_plugin/foundation_and_overrides.scss)
(请注意,虚拟应用程序的 CSS list 是 require
-ing 插件的 CSS list ,即 require
-ing foundation_and_overrides.scss。接线显然不是问题所在因为错误是从 foundation_and_overrides.scss 引发的)
我在多个 Ruby-1.9.3 版本(我认为是 p125、194、p327)上进行了尝试,结果相同。
当我将这一行添加到 test/dummy/config/application.rb 时它仍然没有工作:
config.assets.paths << "#{Foundation::Engine.root}/scss"
即使 foundation/common/_ratios.scss 存在于该路径中。
问题可能出在 Sass、Sprockets、Compass、Foundation 或 Rails 上,所以我不知道从这里该何去何从。
我将其报告为 an issue with Foundation ,但我不太相信这一点。
有人见过这个吗?
最佳答案
我在 this Stackoverflow question 中找到了答案
问题在于 Rails 引擎的虚拟应用程序和常规 Rails 应用程序的 config/application.rb 文件略有不同。
在 Rails 应用程序中,您会在顶部看到以下代码:
if defined?(Bundler)
# If you precompile assets before deploying to production, use this line
Bundler.require(*Rails.groups(:assets => %w(development test)))
# If you want your assets lazily compiled in production, use this line
# Bundler.require(:default, :assets, Rails.env)
end
但是在引擎虚拟应用中,您会看到:
Bundler.require
require "<PLUGIN_NAME>"
在 Rails 应用程序中,第一个 Bundler.require 包括 Gemfile 中的所有组,但不包括 :assets 除非 Rails.env 是 :development 或 :test 第二个 Bundler.require 包括 :default——也就是说,你的 Gemfile 中不在组中的任何东西——以及 :assets 和 :production、:development 或 :test
在虚拟应用中,这些都不是必需的,因为 1) 它不打算在生产中使用,并且 2) 测试和开发通常具有相似的依赖性要求。由于 :assets 组只是将依赖项应用于 :test 和 :development 而不是应用于 :production 的一种便捷方式,因此在虚拟应用程序中它与 :default 相同。因此,在虚拟应用程序中,只需要 :default 即可。由于 Bundler.require
与 Bundler.require(:default)
相同(警告:前方剧透),虚拟应用程序仅使用 Bundler.require
。这意味着您的 Gemfile 中属于组的任何内容都将被忽略。
所以我遇到的问题是我从 Rails 应用程序 Gemfile 复制粘贴到 Rails 虚拟应用程序 Gemfile,包括 group :assets do...
。我删除了 group
行,一切正常!
当天晚些时候在 11 月 29 日添加:
澄清一下,我看到的错误是因为没有包含 sass-rails(因为它在我的 Gemfile 的 :assets 组中),所以我的 Assets 没有被解析为 Sass,而是被解析为 CSS。由于 @import
对 CSS 和对 Sass 的含义不同,因此解析 CSS 文件的任何东西都使用了不同的 @import
实现,因此无法找到该文件。
关于ruby-on-rails-3.2 - Sass @import 指令在 Rails 引擎中使用时无法在插件中找到 Assets ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13630456/