8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

CONSULDEMOCRACY:Sass 失败(未找到 sassc-embeded-import 样式表)

anthony sottile 3月前

81 0

用户故事我正在尝试部署 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)

我觉得好像缺少样式表,但我在网上找不到任何信息。

帖子版权声明 1、本帖标题:CONSULDEMOCRACY:Sass 失败(未找到 sassc-embeded-import 样式表)
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由anthony sottile在本站《ruby》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我无法理解 Ruby 中的特征类或单例类的概念。我读到过很多文章说特征类是类的类。这对我来说毫无意义,因为对我来说,类的类是

    我无法理解 特征类 单例类 。我读到过很多文章说特征类 是类的类 。这对我来说毫无意义,因为对我来说,类的类 Class 实际上是类的实例 Class .

    我不太明白的另一件事是以下陈述:类方法实际上是类特征类的实例方法。特征类可以通过以下方式访问:

    YourClass = Class.new
    class << YourClass
      def class_method
      end
    end
    

    但是,如果特征类确实是 YourClass 类(即 Class ),那么前面的代码片段难道不应该打开该类 Class 并向其添加实例方法, class_method 使得它的所有未来实例(即将来定义的任何常规类)都可以访问它吗?

    我实际上觉得单例类与不一样 Class 。当你这样做时:

    class MyClass
    end
    
    MyClass.singleton_class
    

    你得到的 #<Class:MyClass> 结果与 MyClass.class => Class

    是什么 #<Class:MyClass> ?这与命名空间无关,否则会有两个: Class::MyClass ...

    我正在寻找特征类概念的简单且明确的解释,以澄清我的想法。

  • 老实说,我认为我还没有完全理解,从我在这个答案中读到的内容来看,我不会说“特征类是一个类的类”。从那个答案中,我了解到特征类是一个特殊的类,来自一个对象,其中存在该对象独有的方法。因此,我理解每个对象都有 2 个不同的类:它是经典的“类”,其中存在这种类型的所有对象共有的所有方法和特征类。此外,另一个答案没有解释 #输出...

  • 如果该问题的非常古老且广受欢迎的答案不能回答您的问题,那么您应该在问题中说明您已经阅读过它们,并且它们不能回答您的具体问题,因为您的具体问题在 x、y 和 z 方面有所不同。否则,您的一般问题“Ruby 中的单例类是什么?”确实由

  • @anothermh 公平地说,您引用的答案并没有真正解释“对象的单例类”实际上是什么(我想说,它对单例类所起的作用进行了相当透彻的解释),我相信这就是 OP 问题的重点。因此,我不相信这个问题与您投票关闭的问题重复。

  • 单例类包含特定于单个对象的方法。

    对于通用对象来说,这是一个很好的功能。但对于类来说,这至关重要。让我们从对象开始:

    对象的单例类

    实例方法通常在类中定义。同一类的所有实例共享相同的实例方法。单例类位于对象和其所属类之间。它允许每个实例拥有自己的一组方法,独立于其他实例。

    如果我们有两个类, Foo 每个类有 2 个实例 Bar a , b 并且 c , d

    class Foo ; end
    class Bar ; end
    
    a = Foo.new #=> #<Foo:0x00007fc280963008>
    b = Foo.new #=> #<Foo:0x00007f8319016b18>
    c = Bar.new #=> #<Bar:0x00007fa66c8d7290>
    d = Bar.new #=> #<Bar:0x00007f94d5106ac8>
    

    您将拥有此类结构:(简化,不包括模块)

    object          singleton class              class    superclass   ...
    
      a  #<Class:#<Foo:0x00007fc280963008>> 
                                                Foo 
      b  #<Class:#<Foo:0x00007f8319016b18>>        
                                                        Object  BasicObject
      c  #<Class:#<Bar:0x00007fa66c8d7290>>        
                                                Bar 
      d  #<Class:#<Bar:0x00007f94d5106ac8>> 
    

    Ruby 会延迟创建这些单例类,例如在调用 singleton_class .

    因此,在定义方法时 a.hello ,它并不存储在 a 的类 Foo ,而是 a 的单例类中:

    def a.hello
      'hello from a'
    end
    
    a.method(:hello).owner
    #=> #<Class:#<Foo:0x00007fc280963008>>  <-- a's singleton class
    

    因此, b 实例 Foo ,但看不到该方法

    b.hello #=> NoMethodError: undefined method `hello'
    

    我们甚至可以定义一个同名的方法而 b 不会干扰 a

    def b.hello
      'hello from b'
    end
    
    b.method(:hello).owner
    #=> #<Class:#<Foo:0x00007f8319016b18>>  <-- b's singleton class
    
    a.hello #=> "hello from a"
    b.hello #=> "hello from b"
    

    我们还可以定义一个泛型 hello Foo 在每个实例级别上覆盖它:(通常不会这样做,但这是可能的)

    class Foo
      def hello
        'hello'
      end
    end
    
    def a.hello
      "#{super} from a"
    end
    
    def b.hello
      "b says #{super.upcase}!"
    end
    
    a.hello #=> "hello from a"
    b.hello #=> "b says HELLO!"
    
    c = Foo.new
    c.hello #=> "hello"
    

    类的单例类

    以上内容对于类来说尤其重要。每个类都是以下类的一个实例 Class

    Foo.class #=> Class
    

    假设我们想要一种方法 Foo.hello ,我们应该在哪里定义它?

    实例方法通常在实例的类中定义,因此我们 可以 的类 Foo 中定义它

    class Class
      def hello
        'Hello from Foo'
      end
    end
    
    Foo.hello
    #=> "Hello from Foo"
    

    但这会使该方法适用于所有实例 Class

    Bar.hello
    #=> "Hello from Foo"
    
    String.hello
    #=> "Hello from Foo"
    

    最好有一个 Foo 实例独有的地方。那个地方就是 Foo 的单例类:

    def Foo.hello
      'Hello from Foo'
    end
    

    或者

    class Foo
      def self.hello       # <-- self is Foo, so this is just "def Foo.hello"
        'hello from Foo'
      end
    end
    

    与上面类似 a.hello ,此方法仅适用于 Foo

    Foo.hello #=> "hello from Foo"
    Bar.hello #=> NoMethodError
    

    我们将这些方法称为 类方法 ,但它们实际上只是单例类的实例方法:

    Foo.method(:hello).owner
    #=> #<Class:Foo>   <-- Foo's singleton class
    
    Foo.method(:hello).unbind == Foo.singleton_class.instance_method(:hello)
    #=> true
    

    如果你将类的单例方法与对象的单例方法进行比较,你会发现它们是相同的。这是因为在 Ruby 中,类也是对象,所有对象的工作原理都相同。

  • 我认为您有点偏离主题,因为您将特征类的概念与 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 内部机制的绝佳资源。

    [已编辑,以纳入评论中的部分讨论]

  • \'但是,如果对象是类定义,则 klass 指针指向的不是 Class 类,而是 eigenclass 实例。\' – 实际上,所有对象都是如此。某些 Ruby 实现可能作为一种私有内部优化,仅在真正需要时才真正延​​迟创建单例类,但从概念和语义上讲,每个对象的 klass 始终是其单例类。

  • @JörgWMittag 这很有意思。我感觉这是真的,但找不到任何能让我确信这一点的东西。你能给我指出一些能说明这一点的资源吗,或者建议我可以在哪里找到相关的源代码?

  • 引用 10

    好吧,您可以轻松检查 obj = Object.new; def obj.bar; end; obj.bar; obj2 = Object.new; obj2.bar # NoMethodError 之类的代码是否适用于所有对象。方法 obj.bar 只能存在于 obj 的单例类中。(实际上,有一些对象不能有单例方法,例如 Symbols、Floats 和 Integers。真正的原因是它们在运行时没有实现为对象,因此甚至没有类,更不用说单例类了。但对于我们的语义模型,我们仍然可以假装它们有一个冻结的单例类。)

  • 引用 11

    #Class:MyClass 与 #Class:#Class:MyClass 不同。前者是 MyClass 的单例类,而后者是单例类的单例类。(因此输出不同)

  • @Stefan 我同意您的类似评论,因此这句话。因此,句子“特征类实例中的 klass 指针实际上指向其自身。MyClass.singleton_class.singleton_class 返回 #Class:#Class:MyClass”证明了这一点。“似乎是不正确的。

  • 引用 13

    Eigenclass 不再是 Ruby 世界中使用的名称,因为 Ruby 官方 Object#singleton_class 在不知道哪个版本的地方引入了一种方法(抱歉)。

    Ruby 中的每个对象,无论是“普通”对象还是类,甚至是单例类,都有其自己的单例类。

    单例类是一个类。

    Object.new.singleton_class.is_a?(Class)  #=> true
    

    单例类有且仅有一个实例,它是你调用的对象 singleton_class 。例如,唯一的实例 foo.singleton_class foo .

    Ruby 允许您向单个对象添加方法。

    a = Object.new
    b = Object.new
    
    def a.foo
      'foo'
    end
    
    a.foo  #=> "foo"
    b.foo  #=> raises NoMethodError 
    

    但是所有实例方法都应该定义在类中,那么在哪个类中 a.foo 定义呢?答案是 a.singleton_class 。因为 a.singleton_class 只有一个实例,即 a ,所以实例方法 foo 只能在 上调用 a ,而不能在 上调用 b ,尽管它们是同一类型。

    至于类的单例类,它们的目的是存储“普通类”的类方法,或者如果你稍微动动脑筋,就可以存储与各个类实例绑定的实例方法。

    您是否觉得 Ruby 的对象模型一致且美观?

返回
作者最近主题: