用户故事我正在尝试部署 consuledemocracy 的本地实例,如果失败,则出现 Sass::CompileErrorDescription我的系统是 Ubuntu 22.04,我使用以下版本:Rails v6.1.7.7...
我正在尝试部署 consuledemocracy 的本地实例,如果失败,则会出现 Sass::CompileError
我的系统是 Ubuntu 22.04,我使用以下版本:Rails v6.1.7.7NodeJS v18.18.2PSQL v14.11Ruby v3.2.3
我已按照本地安装的步骤进行操作,虽然可以部署服务器(bin/rails server -b 0.0.0.0),但访问本地主机时出现以下错误:
Completed 500 Internal Server Error in 5267ms (ActiveRecord: 165.5ms | Allocations: 3295956)
ActionView::Template::Error (Error: Can't find stylesheet to import.
1 @import "sassc-embedded-import:19";
^^^^^^^^^^^^^^^^^^^^^^^^^^
sassc-embedded-import:18 1:9 @import
/home/singular/consul/consuldemocracy/app/assets/stylesheets/application.scss 10:9 root stylesheet):
sassc-embedded (1.70.1) lib/sassc/embedded.rb:66:in `rescue in render'
sassc-embedded (1.70.1) lib/sassc/embedded.rb:13:in `render'
sassc-rails (2.1.2) lib/sassc/rails/template.rb:40:in `block in call'
sprockets (4.2.1) lib/sprockets/utils.rb:145:in `block in module_include'
sprockets (4.2.1) lib/sprockets/utils.rb:130:in `synchronize'
sprockets (4.2.1) lib/sprockets/utils.rb:130:in `module_include'
sassc-rails (2.1.2) lib/sassc/rails/template.rb:39:in `call'
sprockets (4.2.1) lib/sprockets/processor_utils.rb:84:in `call_processor'
...
...
当我运行 bin/rails assets:precompile 时,我得到:
singular@euprojects: ~/consul/consuldemocracy$ bin/rails assets:precompile
rails aborted!
SassC::SyntaxError: Error: Can't find stylesheet to import. (SassC::SyntaxError)
1 @import "sassc-embedded-import:19";
^^^^^^^^^^^^^^^^^^^^^^^^^^
sassc-embedded-import:18 1:9 @import
/home/singular/consul/consuldemocracy/app/assets/stylesheets/application.scss 10:9 root stylesheet
Caused by:
Sass::CompileError: Can't find stylesheet to import. (Sass::CompileError)
Tasks: TOP => assets:precompile
(See full trace by running task with --trace)
我觉得好像缺少样式表,但我在网上找不到任何信息。
我认为您有点偏离主题,因为您将特征类的概念与 Ruby 类实例的概念混淆了。它们并不完全相同;更正确的说法是 Ruby 在内部将类定义实现为两个对象。
这很容易证明:
$ irb
> ObjectSpace.count_objects[:T_CLASS]
=> 1285
> Foo = Class.new { def instance_method; end }
=> Foo
> ObjectSpace.count_objects[:T_CLASS]
=> 1287
从内部来看,每个对象都有一个 klass
指针,表面上指向该对象所属的类。但是,每个对象(某些基本类型除外,例如 Integer
, Float
和 Symbol
)也都有一个特征类实例,而这正是 klass
指针实际指向的。那么,对于类,指针 klass
实际上并不指向 Class
类,而是指向类定义中的单例对象,该对象包含保存类方法的方法表。
正如 anothermh 提供的链接所解释的那样,\'普通\' 类对象的方法表包含该类的所有实例方法,而特征类对象的方法表包含该类的所有类方法。这种机制可以防止该类的任何实例访问该类的所有类方法 Class
。
现在,特征类( eigen 在德语中是“own”的意思,意为“我自己的”)是类的类,这就是为什么它也被称为 元类 。(查看源代码 Class::new
,你会看到对的调用 rb_make_metaclass
。)
这就是为什么调用 会 MyClass.singleton_class
返回 #Class:MyClass
而不是 Class
调用 MyClass.class
会返回的原因。此语法类似于 p Foo.new
返回类似 的内容 #<Foo:0x00007f9c0d190400>
,即类和指向实例的指针。 是 #Class:MyClass
, MyClass
的元类或 的类的 MyClass
引用 MyClass
。不要将其与类 MyClass
是 的实例相混淆,后者当然是 Class
.
如果你好奇的话, klass
特征类实例中的指针实际上指向它自己。这可以通过 MyClass.singleton_class.singleton_class
返回 #Class:#Class:MyClass
.
有关更全面的概述,请参阅 《揭秘 Ruby 单例类》 。要查看源代码中发生的情况,请参阅《 Ruby 黑客指南》:第 4 章 。最后, 《Ruby Under a Microscope》 是全面深入探究 Ruby 内部机制的绝佳资源。
[已编辑,以纳入评论中的部分讨论]