2014-02-14 87 views
3

我對嵌套佈局沒有什麼問題。在我的網站上,我只需要爲管理員製作一個單獨的網站部分。應用程序佈局中的嵌套佈局

我有這個在我的application.html.erb文件:

<body> 
    <%= render 'layouts/header' %> 
    <div class="container"> 
     <%= yield %> 
     <%= render 'layouts/footer' %> 
    </div> 
</body> 

我想知道我怎麼現在可以向被插入內部<%= yield %>一次像這樣的模板,因爲管理員一部分,我需要再次像header網站的固定零件和主要佈局中的footer。我將有兩個菜單,而不是headerfooter。我想要<%= yield %>填充新的模板,其中將有頂部菜單和新的<%= yield %>這將充滿來自管理控制器的行動。所以,菜單總是保持在最佳狀態。

我做了一個菜單部分views/admins/_menu.html.erb

<div> 
    <div> 
     <div class="container"> 
      <ul> 
       <li><%= link_to "Action1", '#' %></li> 
       <li><%= link_to "Action2", '#' %></li> 
       <li><%= link_to "Action3", '#' %></li> 
      </ul> 
     </div> 
    </div> 
</div> 

我的新佈局是layouts/sublayouts/admin.html.erb

<%= render 'admins/menu' %> 
<%= yield %> 

目前的選擇是渲染views/admins/_menu.html.erb在頂部每個視圖,但看起來不作爲我的一個很好的解決方案。

正規的網站將有這樣的結構:

Header/Menu 
    | 
Container 
    |Content 
Footer 

和管理的網站將有這樣的結構:

Header/Menu 
    | 
Container 
    |Content 
    |Admin Menu 
    |Admin Content 
    | 
Footer 

什麼是完成這一任務的最好方法是什麼?

回答

1

更新:根據意見,我已經更新更好地理解這個問題

最好的辦法是將其納入您的application.html.erb佈局這個的答案。

所需的行爲是當用戶單擊Admin Panel鏈接或管理菜單上的任何鏈接時,管理菜單出現。

我建議這樣做的方式是,您有一個管理控制器,可處理所有管理視圖的路由,因此單擊Admin Panel按鈕和管理菜單中的所有鏈接將由您的管理控制器處理。一的before_filter添加到您管理控制器是這樣的:

# app/controller/admin_controller.rb 
class AdminController < ActionController::Base 
    before_filter: set_admin_status 

    private 
    def set_admin_status 
    @admin = true 
    end 
end 

在您的應用程序模板執行以下操作:

# application.html.erb 
<body> 
    <%= render 'layouts/header' %> 
    <div class="container"> 
     <% if @admin %> 
      <%= render 'admins/menu' %> 
     <% end %> 
     <%= yield %> 
     <%= render 'layouts/footer' %> 
    </div> 
</body> 

這是什麼應該做的是,每次你導航到對應Admin Panel或頁面管理菜單中的任何鏈接都會將@admin_status標誌設置爲true,並且您的佈局將呈現管理菜單,我相信這是所需的行爲。

+0

看起來不錯,但是如何才能完成該菜單的顯示,只有當我點擊打開視圖的管理菜單的按鈕時才顯示出來?目前它會立即顯示在頭版以及所有內容。 – user3304086

+0

您能澄清一點:您是否希望管理員導航到管理頁面(因此只有一個顯示管理員/菜單部分的視圖),還是您有整個管理部分是一系列頁面(所以你有多個視圖加載這個部分)? – alalani

+0

好:)在標題裏我有菜單鏈接(管理面板,Link2等)。用戶點擊Link2後,鏈接的內容顯示在「yield」位置。但是,當用戶點擊管理面板後,帶有鏈接的新菜單(AdminMenuLink1等)顯示在yield中。現在我有兩個菜單!管理員點擊AdminMenuLink1後,內容會顯示在下方,但第二個菜單仍然存在。如果用戶僅在菜單2中的鏈接(AdminMenuLink1等)上導航,菜單應始終存在。如果管理員從第一個菜單中點擊Link2,他會退出管理菜單並在沒有第二個菜單的情況下再次查看正常內容。 – user3304086

1

通常我下面來完成同樣的問題,我創建一個基於父類中分離的佈局:

application_controller.rb

class ApplicationController < ActionController::Base  
    protect_from_forgery 
    layout :layout 

    private 
    def layout 
    if self.class.parent == Admin 
     'application_admin' 
    else 
     'application' 
    end 
    end 
end 

應用程序/視圖/佈局/ application.html .haml

Header/Menu 
    | 
Container 
    |Content 
Footer 

一PP /視圖/佈局/ application_admin.html.haml

Header/Menu 
    | 
Container 
    |Content 
    |Admin Menu 
    |Admin Content 
    | 
Footer 

更新1


配置/ routes.rb中

namespace :admin do 
    root to: 'home#index' 
    resources :admins 
end 

應用程序/控制器/管理/admins_controller.rb

class Admin::AdminsController < ApplicationController 
    def index 
    // code 
    end 
end 
+0

我沒有成功使用此代碼。這行'如果self.class.parent == Admin'比較是當前控制器「Admin」的名稱?在我的情況下,我設置'如果self.class.parent == AdminsController'。 – user3304086

+0

@ user3304086我已更新帖子,很快你應該將'admins_controller.rb'移動到'app/controllers/admin'命名空間 –

+0

嗯,現在我收到以下錯誤:'無法呈現佈局:未初始化的常量ApplicationController :: Admin' – user3304086