0

通常推荐的解决方案是content_for在父布局文件中。但这导致必须在每个视图中指定它,因为如果内容不存在于子视图部分中,默认将不显示它。

例如,如果我有一个要隐藏在身份验证页面中的侧边栏,但在其他任何地方都有,我现在必须在除身份验证页面之外的每个视图文件中指定侧边栏的内容。不干燥。

这比以前更麻烦且不枯燥,我可以在布局中渲染侧边栏部分并完成它(但没有选择它在哪里渲染或不渲染的好处)。

如果您能以某种方式在布局模板中指定调用侧边栏的部分为不招标(如果它是会话控制器或设计控制器),那就太好了。

有没有办法做到这一点?我试过使用

unless devise_controller?
  render "layouts/sidebar"

但这似乎没有按预期工作。


以 Devise 为例,我有一个 application.html.slim 文件,如下所示

.row
  main
    .col-sm-9
      = yield
    - unless devise_controller?
      .col-sm-3
        == render 'layouts/sidebar'

暂时忽略这些列。要点是=yield渲染普通模板以及设计模板。所以我不能在一个 DRY 笔划中选择性地禁用侧边栏。我必须将侧边栏渲染调用放在每个视图文件中,但不要将其包含在我的设计视图中。这并不比在每个非设计视图文件中使用 content_for 更好或更干燥。

回到列,我希望生成的设计视图全宽为 12 列,而不是 9 列。但这只是奖金,而不是主要问题。

4

2 回答 2

1

如果您坚持检查控制器名称,您可以这样做:

<% if controller.controller_name == 'devise' %>
...
<% else %>
  <%= render 'sidebar' %>
<% end %>
于 2014-10-07T13:51:59.707 回答
1

我只是实现了冗长的做事方式。我将使用一个复杂的示例,因为它可能更有帮助。

在这里,我设置了完整的案例,这取决于我是否需要侧边栏,主要是因为引导列和行的工作方式。如果您使用的是引导程序,您会注意到,一旦您阻止侧边栏呈现,您将剩下的主要内容不会占用侧边栏不再占用的空间。这是因为您之前必须将侧边栏和主要内容放在特定的列宽中,并且放在一行中(以便它们并排显示)。由于您希望在侧边栏消失时填充主要内容并占据整个宽度,因此在这种情况下您必须应用完全不同的列宽。因此完整的 if - else 语句。

因此,像这样实现它,确保在每个主要生成的视图文件中包含.rows和。.col-*-*

应用程序.html

  - if hide_sidebar?
    main
      = yield
  - else
    .row
      .col-xs-12.col-sm-9
        main
          = yield
      .col-xs-12.col-sm-3
        == render 'layouts/sidebar'

如果您希望拥有或不拥有侧边栏的页面列表变得比某个控制器的所有操作更复杂,请实现一个单独的辅助方法来指定所有条件。

这是在控制器中执行此操作的一种方法。在我的示例中,当它是注册控制器和用户控制器的显示操作时,我想隐藏侧边栏。我只是||在辅助方法中每个出来。

application_helper.rb

def want_sidebar?
  (controller_name == 'registrations') || ( (controller_name == 'users') && action_name == 'show' )
end
于 2014-10-07T15:04:43.567 回答