【问题标题】:How to assign different stylesheets in a rails project?如何在 Rails 项目中分配不同的样式表?
【发布时间】:2011-12-11 16:11:14
【问题描述】:

我有一个样式表,application.csslayouts/application.html.erb 中定义:

<%= stylesheet_link_tag "application" %>

但是,在网站的某个部分,视图将使用完全不同的样式表,dashboard.css,我已在其index.html.erb 中定义:

<head>
    <title>My title</title>
    <%= stylesheet_link_tag "dashboard" %>
..

除非我删除了应用程序布局文件中的 stylesheet_link_tag,否则会存在使仪表板视图变得奇怪的冲突。如果我将应用程序布局样式表标记移动到一个 _header.html.erb 部分,该部分与非仪表板部分中的每个视图一起呈现,如下所示,它不起作用。我该怎么称呼他们?

<%= stylesheet_link_tag "application" %>
<header>
     <div id="headercontainer">
..

【问题讨论】:

    标签: ruby-on-rails css


    【解决方案1】:

    你应该在你的 application.html.erb 中的 head 元素中使用 yield 语句:

    <head>
      <%= yield :head %>
    </head>
    

    那么在你看来,你会使用 content_for 标签:

    <% content_for :head do %>
      <%= stylesheet_link_tag "dashboard" %>
    <% end %>
    

    还阅读了关于嵌套布局的rails docs。它会教你如何使用这种范式

    【讨论】:

    • 当每个视图都可以更改其布局中的某些内容(例如设置title)时,此技术非常有用。在这种情况下,@Simpleton 只想在一种情况下使用备用样式表。您认为参考 application.css 是否值得将所有其他视图弄乱?
    • 好吧,我不想去重做 simpleton 的网站,但如果我们谈论的是最佳实践。那么他的应用程序布局中的样式表应该与应用程序中的所有视图兼容。然后任何特定于布局的代码都将进入模板本身。以这种方式进行设置将是朝着正确方向迈出的一步
    • 另一种选择是 application.html.erb 中的 if / case 语句,通过 params 选择适当的样式表 - 希望这对阅读本文的人有意义?
    【解决方案2】:

    使用特定样式表为您的仪表板创建单独的布局。

    如果您想要为您的一个控制器(及其所有操作)定制样式表,这很容易做到。创建一个名称匹配的布局,即对于您的users_controller,模板名称应为users.html.erb

    您还可以为控制器指定任何布局。

    class UsersController < ApplicationController
      layout 'some_layout'
    end
    

    如果您只想为某些操作自定义样式表,请在调用 render 时指定相应的布局。

    def dashboard
      # some logic here
      render :layout => 'some_layout'
    end
    

    【讨论】:

    • 如果你有 users_controller,在布局中定义 users.html.erb,rails 会选择它。
    • 或者你可以通过自己调用renderrender :layout =&gt; 'my_layout'来指定任何布局
    • 最后你可以在你的控制器中使用layout :dashboard
    • Sergei,这也是一个很好的方法,可能更适合他在这里的实现。我自己过去用过这个。好答案!
    【解决方案3】:

    我建议您为仪表板定义第二个布局 (app/views/layouts/dashboard.html.erb)。从该布局链接到仪表板样式表。然后在仪表板视图或控制器中使用该布局。

    哦,只需使用一些 if 条件来链接同一布局中的不同样式表:

    <%= stylesheet_link_tag(dashboard_views? ? "dashboard" : "application") %>
    

    只实现dashboard_views?根据您的视图返回 true 或 false 的辅助方法。

    【讨论】:

    • 那为什么不让助手返回样式表名称呢? &lt;%= stylesheet_link_tag get_stylesheet_name %&gt; 哦,你的代码中有不平衡的括号:-)
    • 好点。我们可以在这里使用许多不同的方式。我个人也会使用克里斯的解决方案。感谢缺少 ')' 问题,我已经解决了。现在在日本冲浪红眼 ;-)
    猜你喜欢
    • 2012-03-27
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多