HAML и вложенные макеты - PullRequest
       1

HAML и вложенные макеты

7 голосов
/ 07 декабря 2010

По сути, я хочу иметь корневое приложение.haml, содержащее ядро ​​css и js, тогда макет сайта выглядит примерно так:

  • application.haml
    • marketing.haml (s) со своими CSS и наценками
    • userbackend.haml (s) с их собственными CSS и наценками
    • siteadministrators.haml (s) с их собственными CSS и наценками

Итак, я попытался сделать это, добавив sub_layout к моим контроллерам, например, мой домашний контроллер, который является разделом маркетинга, получает:

def sub_layout
    "marketing"
  end

контроллеры для актуального приложения, которое пользователи используют

def sub_layout
   "userapplication"
end

def sub_layout
   "siteadministrators"
end

тогда в приложении. Хамл я звоню = render (: parital => "layouts / # {controller.sub_layout}")

это возвращает "неопределенный метод" format "для nil: NilClass"

Как и многие здесь, я очень плохо знаком с рельсами и хамлом, особенно если у меня есть опыт работы с .NET MVC и движком Spark View

есть мысли о том, как выглядит этот хамл?

Ответы [ 2 ]

15 голосов
/ 16 декабря 2010

Как вы и подозревали, есть стандартный и намного, гораздо лучший способ сделать это.Ваш 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: styles', выполняется в контексте соответствующего выхода враскладка.Вам не нужно иметь content_for для каждого выхода, если у вас есть несколько, результаты объединяются.

Наслаждайтесь!

2 голосов
/ 07 декабря 2010

Попробуйте это:

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

Вызов метода на контроллере проблематичен, поскольку он потенциально представляет ваш метод как действие.Поскольку вы просто возвращаете строку, вы можете сделать это (например):

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

Лучшим вариантом, вероятно, является абстракция этого метода во вспомогательный, где вы можете найти значение с помощью класса контроллера и вернутьимя файла макета.Это будет держать контроллеры в чистоте.

...