2010-12-07 150 views
7

基本上我想要做的是有包含核心CSS和JS根application.haml然後站點佈局雲像HAML和嵌套式佈局

  • application.haml
    • marketing.haml (S)與自己的CSS的和標記
    • userbackend.haml(S)用自己的CSS的和標記
    • siteadministrators.haml(S)用自己的CSS的和標記

於是,我就加入了sub_layout到我的控制器,以便例如我家的控制器,它是一種營銷部得到這樣做:

def sub_layout 
    "marketing" 
    end 

控制器,爲用戶使用

的actualy應用
def sub_layout 
    "userapplication" 
end 

def sub_layout 
    "siteadministrators" 
end 

然後在application.haml我請 =渲染(:parital => 「的佈局/#{controller.sub_layout}」)

這將返回「未定義的方法`格式爲無:NilClass」

許多人一樣在這裏我很新的軌道和HAML特別是雖然我確實有.NET MVC經驗和星火視圖引擎

對這個haml看起來有什麼想法?

回答

15

正如你懷疑的那樣,有一個標準的,更好的方法來做到這一點。 您application.haml:

!!! XML 
!!! 
%html 
    %head 
    %title Title 
    = stylesheet_link_tag 'global' 
    = yield :styles 
    %body 
    #content 
     = yield 
    = yield :scripts 

然後你marketing.haml:

- content_for :styles do 
    = stylesheet_link_tag 'marketing' 

- content_for :scripts do 
    = javascript_include_tag 'marketing' 

%h1 It's Marketing time! 

在任何「content_for:風格」塊被在佈局其各自的收益率的上下文中執行。如果您有多個收益,您不需要爲每個收益提供一個content_for,結果會被連接起來。

享受!

+0

雖然我有一個後續問題 - 我如何在佈局的上下文中使用它?所以應用程序 - >蔬菜 - >創建蔬菜應用程序 - >蔬菜 - >編輯蔬菜都應該得到'vegetable.css'文件 – maehue 2010-12-20 03:42:00

2

試試這個:

= render :file => "layouts/#{controller.sub_layout}" 

調用控制器上的一個方法是,它可能暴露你的方法作爲一個動作問題。因爲你只是返回一個字符串,你可以這樣做(例如):

class HomesController < ApplicationController 
    @@sub_layout = "marketing" 
    cattr_reader :sub_layout 

一個更好的選擇可能是抽象到這一個輔助方法,你可以查找與控制器類中的值,並返回佈局文件名。這將保持控制器更清潔。

+0

但是,這樣做的作品,但你的「更好的選擇」的評論讓我覺得我不得不重新考慮我是如何做到這一點 - 有點驚訝於ROR的所有明智的默認值沒有一個明確的方法來做到這一點,因爲它似乎真的對我來說很明顯 – maehue 2010-12-08 02:18:12