这是由于 Sprockets 和糟糕的 CSS 结构造成的。
#app/assets/stylesheets/application.css
*= require_all
问题不是 CSS,而是 您调用它的方式 - 无论是在您的资产管道还是您的应用程序中。
以上内容会将您的所有 css 连接到主 application.css 文件中。虽然这看起来无害,但如果您有冲突的 CSS 定义,它们会覆盖自己。
解决这个问题的方法是首先确保您的 CSS 没有冲突并且您正在调用仅适合您的应用程序的 CSS。
链轮
为了更好地理解修复,您需要了解sprockets。
Sprockets编译您的资产以使其尽可能高效。
您的资产驻留在资产管道中,该管道已被创建为可以为您应用的不同部分加载适当的 CSS - 既高效又通用。
Rails 执行此操作的“常规”方式是鼓励您使用以控制器为中心的资产和应用程序级别的资产:
#app/assets/stylesheets/controller.css
#app/assets/stylesheets/application.css
如果您的 CSS 在原地工作,这没关系,但如果不能,您就有问题(就像您遇到的情况一样)。
因此,解决方法是首先确保您根据需要拆分 CSS,并且正确编码 CSS(稍后再说)。
以控制器为中心的资产
1.删除“application.css”中的所有引用
Sprockets 使您能够将其他文件“包含”到您的主 application.css 文件中:
#app/assets/stylesheets/application.css
*= require_all <- remove this line
这将防止您的“application.css”文件将所有其他文件编译到其中。其他的会自己编译,让你call them separately:
2。布局
#app/layouts/application.html.erb
<%= stylesheet_link_tag "application", controller_name %>
这将允许您使用基础级应用程序 CSS 调用以控制器为中心的资产。
这样做的缺点是您必须重复大量 CSS,并且最终会为您的应用的不同部分使用完全不同的 CSS - 不是最好的。
CSS 结构
另一种方法是使您的 CSS 结构合理。这要实现起来要困难得多,但会给您带来更清晰的结果...
我的 Sessions 控制器(登录页面)和我的 Records 控制器(搜索功能)有一个宽度不同的 main div。
#app/assets/stylesheets/application.sass
.main
/* main styling */
&.search
/* search styling here */
&.results
/* results styling here */
这将允许您调用:
#app/views/layouts/application.haml
.main.search search stuff here
.main.results results stuff here