【问题标题】:Rails: How do I properly avoid a circular dependency error with my CSS but still include all the files?Rails:如何正确避免 CSS 的循环依赖错误,但仍包含所有文件?
【发布时间】:2012-11-23 19:00:41
【问题描述】:

我是 Rails 的新手,我希望这是一个简单的问题,但我无法在此处或通过谷歌搜索找到它。我经历过severaldifferentsimilarposts,但从未完全解决我的问题。 (“帖子”上的第四个链接是完全相同的问题,但从未解决或回答。)

我正在尝试设置一个非常简单的博客应用程序来玩。我想做的(现在)就是建立一个全局 application.css[.scss is optional] 和一个特定于页面的 post.css[.scss]。

我的 application.css 如下所示:

//= require_self
//= require_tree .

body {
    background-color: #CCF;
}
#main_content_div {
    width:90%; 
    padding:10px; 
    margin: 15px auto; 
    background-color:#FFF;
}

如果你问我,就很简单了。

我的 post.css.scss 看起来像这样:

.postlist_row {
    border: 1px solid red;
}

没什么花哨的。

但是当我尝试访问 /posts 时,我最终得到:

Sprockets::CircularDependencyError in Posts#index

对此的标准 SO 答案似乎是“好吧,只需删除该 require_tree 语句即可。您使用的是 Rails 3 和 Sprockets,因此这已经发生了,并且您将双重包含相同的文件。”

这可能是真的。如果我删除了 require_tree,application.css 就可以正常工作。但是,这就是我的问题似乎与其他问题不同的地方,它从不包括 post.css.scss。其中没有任何规则应用于页面,也没有显示在源代码中。

我对管道的了解还不够,无法确定问题出在哪里,无论是因为我的语句顺序还是因为一个是 css 而另一个是 scss 或我的配置...我只是不知道。

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails circular-dependency sprockets


    【解决方案1】:

    如果您删除 //= require_tree .,则您需要自己包含控制器特定资产。

    http://guides.rubyonrails.org/asset_pipeline.html#how-to-use-the-asset-pipeline

    例如,如果你生成一个 ProjectsController,Rails 也会添加 一个新文件在app/assets/javascripts/projects.js.coffee 和另一个在 app/assets/stylesheets/projects.css.scss。你应该把任何 JavaScript 或 CSS 对各自资产中的控制器来说是唯一的 文件,因为这些文件可以为这些控制器加载 带有诸如<%= javascript_include_tag params[:controller] %>之类的行 或<%= stylesheet_link_tag params[:controller] %>

    你这样做了吗?

    或者,您可能希望保留//= require_tree .,以便您的应用可以为所有请求(浏览器可以在第一页之后缓存)提供一个样式表,并使用选择器将某些样式限制为特定页面。例如,您可以在应用程序的布局模板中将 params[:controller] 作为类添加到页面主体,这样您就可以将样式范围限定为仅应用于该控制器的视图:

    body.posts {
      .postlist_row {
        border: 1px solid red;
      }
    }
    

    【讨论】:

    • 如果我留下//= require_tree .,我会得到一个循环依赖错误。如果我删除它并手动添加资产,那么任何一个模板都不再是通用的,因为我在那里有特定于控制器的东西,或者,如果我为每个页面添加我可能需要的所有样式表,我会提供更多服务比我每次通话都需要,这两个都不是好的解决方案。有没有办法让//= require_tree . 留在里面而不引起循环依赖?
    • 使用默认资产结构,您不应该看到这种循环依赖,但在上面的示例中,我也看不到会引入一个的要求。仔细检查您的更改,看看是否有上面没有提到的要求会引入这种依赖关系?不相关:使用所有样式提供大型单个压缩资产不一定是一个坏主意,因为它实际上只提供一次并为来自该客户端的每个后续请求缓存。如果您确实想提供不应使您的模板“不通用”的每个控制器资产。
    • 我被这个难住了。我绝对没有其他要求。唯一存在的 css 文件是上面的两个(它们是整个文件)加上 home.css.scss,它只有自动生成的 cmets(不需要),以及脚手架.css,它也是自动生成的,包含一堆默认的 rails样式,但同样,没有要求。我在想项目配置在某个地方被破坏了。我可能只是从头开始;我不是很远。
    猜你喜欢
    • 1970-01-01
    • 2011-12-24
    • 2011-06-16
    • 2021-08-02
    • 2020-02-13
    • 2020-09-15
    • 1970-01-01
    • 2013-02-06
    相关资源
    最近更新 更多