ruby-on-rails-3.2 - Sass @import 指令在 Rails 引擎中使用时无法在插件中找到 Assets

标签 ruby-on-rails-3.2 sass compass-sass sprockets zurb-foundation

我正在构建一个使用 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.requireBundler.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/

相关文章:

ruby-on-rails - 如何调试在 docker 容器中运行的 rails 应用程序

ruby - compass ( ruby )编码错误

linux - 系统(命令)在生产服务器上返回 false : Ruby on Rails

ruby-on-rails - Ruby on Rails 法语即时消息

javascript - react 单选按钮在第一次点击时不起作用

css - 选择选项时如何更改 ng-select 控件的样式

css - 如何从 SASS 中的嵌套类定位父类

ruby-on-rails - 如何将应用程序 css 包含到 Rails 3.1 中的邮件程序 View 中

css - 在 Windows 上使用 PrePros 编译 Sass

heroku - 错误 H13(连接关闭,没有响应) Heroku