2014-10-07 28 views
0

通常推荐的解决方案是在父布局文件中的content_for。但是这会导致必须在每个视图中指定它,因为如果内容不在子视图部分中,默认设置就不会显示它。例如,如果我有一个我想隐藏在认证页面中的边栏,但在其他地方都有,那么现在我必须在除认证页面以外的每个视图文件中指定边栏的内容。不干。更加干净的方式显示/隐藏轨道中的部分/模板

这比以前更麻烦,也不干燥,我可以在布局中渲染一个侧栏,并用它来完成(但没有选择它在哪里或不在哪里渲染的好处)。

如果您可以以某种方式在布局模板中指定如果它是会话控制器或设计控制器而调用侧栏部分不投标,那将会很好。

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

unless devise_controller? 
    render "layouts/sidebar" 

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


以与制定一个例子,我有像这样

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

忽略列的一刻,application.html.slim文件。重点是=yield呈现正常的模板以及设计模板。所以我不能在一次DRY中风中选择性地禁用边栏。我必须在每个视图文件中放置边栏呈现调用,但不要将其包含在我的设计视图中。这并不比在每个非设计视图文件中使用content_for更好或DRYer。

回到列,我想有12列,而不是9列产生的设计意见。但这只是奖金,而不是主要问题。

+1

你可以有权威性的网页,你会不会使侧边栏,无特别的布局? – 2014-10-07 13:32:32

+0

如果你指的是设计视图文件,我认为不是。我在application.html文件中有一个'= yield',它呈现了设计视图模板。所以设计意见受其父母的造型影响。让我在OP中增加一些代码。 – ahnbizcad 2014-10-07 13:35:47

+0

你能为我提供一些具体细节吗? @Sergio Tulentsev?我不知道它是哪个文件,或者你有什么样的设计模式。 – ahnbizcad 2014-10-07 13:41:26

回答

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 
1

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

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

我只坚持有一个干燥的'if'条件。看起来比做设计布局更直接一点。也许我高估了复杂性。 – ahnbizcad 2014-10-07 14:01:04

+0

该代码不适合我。它必须是'devise_controller?'不能正常工作的原因。 – ahnbizcad 2014-10-07 14:43:03

+1

您可能需要调整=='设计部分'。您是否尝试过输出控制器名称,例如<%= controller.controller_name%>并检查。另外,它可能是注册控制器。玩一下它。 – 2014-10-07 14:57:41