开发者

HAML and Nested Layouts

Essentially what I want to do is have a root application.haml that contains the core css and js then the site layout goes something like

  • application.haml
    • marketing.haml(s) with their own css's and markups
    • userbackend.haml(s) with th开发者_JAVA百科eir own css's and markups
    • siteadministrators.haml(s) with their own css's and markups

So I tried doing this by adding a sub_layout to my controllers so for instance my home controller which is a marketing sections gets:

def sub_layout
    "marketing"
  end

controllers for the actualy application that the users use

def sub_layout
   "userapplication"
end

def sub_layout
   "siteadministrators"
end

then in the application.haml I call = render(:parital => "layouts/#{controller.sub_layout}")

this returns "undefined method `formats' for nil:NilClass"

Like many on here I'm very new to rails and haml especially though I do have experience with .NET MVC and the Spark View engine

any thoughts on what this haml looks like?


As you suspected, there is a standard and much, much better way of doing this. Your application.haml:

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

And then your marketing.haml:

- content_for :styles do
  = stylesheet_link_tag 'marketing'

- content_for :scripts do
  = javascript_include_tag 'marketing'

%h1 It's Marketing time!

Anything in the 'content_for :styles' block gets executed in the context of it's respective yield in the layout. You don't need to have a content_for for every yield, if you have multiple, the results get concatenated.

Enjoy!


Try this:

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

Calling a method on the controller is problematic in that it potentially exposes your method as an action. Since you're just returning a string, you could do this (e.g.):

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

A better option is probably to abstract this into a helper method where you can lookup the value with the controller class and return the layout file name. That would keep the controllers cleaner.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜