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

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

  • application.haml
    • marketing.haml(s) with their own css's and markups
    • 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

затем в application.haml я вызываю = render(:parital => "layouts/#{controller.sub_layout}")

это возвращает «неопределенные форматы метода для nil: NilClass»

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

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


person maehue    schedule 07.12.2010    source источник


Ответы (2)


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

Наслаждаться!

person gunn    schedule 16.12.2010
comment
У меня есть дополнительный вопрос: как мне использовать это в контексте с макетами? Таким образом, Приложение->Овощи->Создать овощное приложение->Овощи->Редактировать овощ должно получить файл 'vegetable.css' - person maehue; 20.12.2010
comment
Я не совсем уверен, что вы имеете в виду. В моем примере application.haml — это макет. Между прочим, в рельсах вы действительно должны называть их application.html.haml, marketing.html.haml и т. д. - person gunn; 20.12.2010
comment
Извините, не ожидал, что вы ответите так быстро, я отредактировал свое продолжение. - person maehue; 20.12.2010
comment
Так что в этом случае у меня будет файлик овощей. - person maehue; 20.12.2010
comment
Он будет называться овощи.html.haml и находиться в директории макетов. Я думаю, что такой метод: guides.rubyonrails.org/ будет решить вашу проблему наилучшим образом. - person gunn; 20.12.2010

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

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

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

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

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

person zetetic    schedule 07.12.2010
comment
Это работает, однако ваши комментарии о лучшем варианте заставляют меня думать, что мне нужно переосмыслить, как я это делаю - немного удивлен всеми разумными значениями по умолчанию в ROR, нет четкого способа сделать это, поскольку это кажется мне действительно очевидным. - person maehue; 08.12.2010