2013-01-17 115 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是默認值。如果你想讓你的控制器使用這種佈局,你不需要這條線。如果你需要控制器的另一種佈局,這是軌道辦法。所有其他解決方案都是猴子補丁,並且打破了常規配置中的鐵軌角色。 :) –