【问题标题】:How to conditionally add class to <body> in rails layout如何在rails布局中有条件地将类添加到<body>
【发布时间】:2017-04-28 13:24:30
【问题描述】:

我的 application.html.erb 文件如下所示

<!DOCTYPE html>
<html lang="en">
  <head>
  .
  .
  .
  </head>
  <body <%= "class=landing-bg" if !@landing.nil? %>>
    <%= render 'layouts/header' %>
    <div class="container">
    .
    .
    .
    </div>
    <%= render 'layouts/footer' %>
    <% if !@landing.nil? %>
      <div class="landing-gradient"></div>
    <% end %>
  </body>
</html>

我在&lt;head&gt; 中遗漏了一堆元标记,并在正文中遗漏了一堆与问题无关的其他代码。

static_pages_controller

def home
  @landing = "landing"
end

我只需要在我的主页上向&lt;body&gt; 添加一个类,并在页脚下方添加一个 div。我觉得我正在做的事情有点hacky。而且,如果我只为着陆页创建一个单独的布局,它就不会是 DRY,因为我会重复这个布局上的大量代码。

最好的方法是什么?什么是rails way?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4


    【解决方案1】:

    我的典型模式是将控制器和动作添加到 body 的类中,然后在我的 css 中使用它们作为选择器,如下所示:

    <body class="<%= controller_name %> <%= action_name %>">
      <!-- etc -->
    </body>
    

    至于您的第二期有条件的正文仅在主页上,您可以简单地将其添加到主布局中的正文中并仅在登录页面上显示:

    <body class="<%= controller_name %> <%= action_name %>">
      <!-- etc -->
      <div class="landing-gradient"></div>
    </body>
    
    # application.css
    .landing-gradient {
      display: none;               // Hide the gradient
    }
    
    .landing .landing-gradient {
       display: inline;            // Show gradient b/c of more specific selector
    }
    

    这是我个人的偏好,因为您将单个元素的显示留给 css/表示层而不是在您的控制器中。

    最后,您还可以使用content_for around the footer,这样您就可以跨各个页面自定义页脚。不过,对于您的示例来说,这有点笨拙,所以如果您经常自定义页脚,我只会使用它。

    【讨论】:

      【解决方案2】:

      在我的情况下,我希望每个布局有一个不同的类(至少可能),所以在app/views/layouts/application.html.erb 我这样做:

      <body class="<%= yield(:body_class) %>">
      

      然后在我的布局文件中我这样做:

      <% content_for(:body_class) { 'my-class' } %>
      

      【讨论】:

        【解决方案3】:

        您也可以在不创建实例变量并在视图中验证它但使用params[:action]params[:controller] 的情况下对其进行管理:

        <body class="<% 'class_value' if params[:controller] == 'static_pages' && params[:action] == 'home' %>"
        

        如果您没有多个home 方法,您可以只验证操作(方法)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-30
          • 2019-07-19
          • 2018-03-19
          • 2014-05-22
          • 2014-04-18
          • 2017-01-02
          • 2015-03-06
          • 2010-12-21
          相关资源
          最近更新 更多