如何在rails布局中有条件地将类添加到<body>

use*_*963 2 ruby-on-rails ruby-on-rails-4

我的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>
Run Code Online (Sandbox Code Playgroud)

我遗漏了一大堆meta标签,<head>还有一堆与该问题无关的正文中的其他代码.

static_pages_controller

def home
  @landing = "landing"
end
Run Code Online (Sandbox Code Playgroud)

我需要<body>在我的主页上添加一个类和页脚下方的div.我觉得我在做什么有点hacky.而且,如果我为登陆页面创建了一个单独的布局,那么它就不会是DRY,因为我会重复这个布局上的很多代码.

做这个的最好方式是什么?什么是铁轨方式?

Gav*_*ler 5

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

<body class="<%= controller_name %> <%= action_name %>">
  <!-- etc -->
</body>
Run Code Online (Sandbox Code Playgroud)

至于你的第二期有条件正文仅在主页上,你可以简单地将它添加到主布局中的正文中,并仅在着陆页上显示它:

<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
}
Run Code Online (Sandbox Code Playgroud)

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

最后,您还可以使用content_for页脚周围的内容,以便您可以跨页面自定义页脚.虽然这对你的例子来说有点沉重,所以我只会在你自定义页脚时使用它.