一种更干燥的方式来显示/隐藏rails中的部分/模板

时间:2014-10-07 13:29:35

标签: ruby-on-rails view-templates

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

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

这比以前更麻烦且不干燥,我可以在布局中渲染侧边栏并完成它(但没有选择它做什么或不做渲染的好处。)< / p>

如果你能够以某种方式在布局模板中指定调用侧边栏部分不招标,如果它是会话控制器或设计控制器,那将是很好的。

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

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列。但这只是奖金,而不是主要问题。

2 个答案:

答案 0 :(得分:1)

如果您坚持检查控制器名称,则可以执行以下操作:

<% if controller.controller_name == 'devise' %>
...
<% else %>
  <%= render 'sidebar' %>
<% end %>

答案 1 :(得分:1)

我只是简单地实施了冗长的做事方式。我将使用一个复杂的例子,因为它可能会更有帮助。

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

因此,请执行此操作,确保在每个主要生成的视图文件中包含.rows.col-*-*

<强> application.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