2013-01-17 87 views
0

我有2列布局。有些控制器已经离开列,有些没有。渲染它的最佳方式取决于控制器是什么?现在,它看起来很喜欢:在Ruby on Rails的条件下渲染部分模板

<% if params[:controller] != 'page' %> 
     <div id="navigation" class="l"><%= render "layouts/left-menu" %></div> 
    <% end %> 

这是坏的,坏的猴子代码。

回答

2

编辑:更改我的解决方案,OP想要的条件取决于动作控制器。

在你的基地帮手,这样定义的方法:

# app/helpers/application_helper.rb 
module ApplicationHelper 
    def has_left_menu? 
    @has_left_menu.nil? ? 
     true : # <= default, change to preference 
     @has_left_menu 
    end 
end 

在应用程序中的控制器:

# app/controllers/application_controller.rb 
class ApplicationController 
    def enable_left_menu! 
    @has_left_menu = true 
    end 
    def disable_left_menu! 
    @has_left_menu = false 
    end 
end 

在视图或布局,支票更改为这样:

<% if has_left_menu? %> 
    <div id="navigation" class="l"><%= render "layouts/left-menu" %></div> 
<% end %> 

现在您可以在before_filters或acti的其他任何地方禁用/启用左侧菜单上:

class UsersController < ApplicationController 
    # enable left menu for "index" action in this controller 
    before_filter :enable_left_menu!, :only => [:index] 

    # disable left menu for all actions in this controller 
    before_filter :disable_left_menu! 

    def index 
    # dynamic left menu status based on some logic 
    disable_left_menu! if params[:left_menu] == 'false' 
    end 
end 
+0

有趣的解决方案。 – Meliborn

+0

但是如果我需要按行动划分? – Meliborn

+0

为什么这比在控制器中使用布局方法更好?对于可能会看到此代码的其他开发人员来说,这种干扰更少,代码更多并且不太容易理解。 –

1

在你的控制器使用的布局像这样

#PublicController is just an example 
class PublicController < ApplicationController 
    layout "left-menu" 
end 

而且在views/Layouts文件夹你把左边的menu.html.erb

与stylesheet_link_tag您spesific css文件

<%= stylesheet_link_tag 'left-menu' %> 

您可以了解更多的rails guides

+0

但我有很多控制器,必须呈现左菜单。我必须为每个控制器添加布局? – Meliborn

+0

views/layouts中的文件application.html.erb是默认值。如果你想让你的控制器使用这种布局,你不需要这条线。如果你需要控制器的另一种布局,这是轨道办法。所有其他解决方案都是猴子补丁,并且打破了常规配置中的铁轨角色。 :) –