Многоуровневая вложенная компоновка в Rails 3 - PullRequest
13 голосов
/ 30 июня 2011

У меня есть приложение с глобальным файлом макета приложения application.html.haml.Затем у меня есть несколько «стеков контроллеров»: для нашего основного сайта, нашего административного портала и нашего бизнес-сайта.Для каждого из них контроллеры находятся в модуле, и все они наследуются от одного и того же BaseController.Каждый стек имеет свой собственный файл макета.Внутри стека некоторые контроллеры также имеют файлы макетов.

Я бы хотел, чтобы все представления (если не указано иное) отображались на нескольких уровнях вложенных макетов: application, "stack", "controller".

Например, для действия Site::BlogController#show я бы хотел рельсы рендерить:

/site/blog/show.html.haml внутри /layouts/site/blog.html.haml внутри /layouts/site.html.haml внутри /layouts/application.html.haml

Яс трудом понимая, как вставить /layouts/site.html.haml в стек.Похоже, что автоматически, rails будет визуализировать действие внутри макета контроллера внутри макета приложения, однако я не вижу, как «вставить» макеты в стек рендеринга.

Любая помощь очень ценится,тем не менее, я прочитал все руководства по рельсам безрезультатно, поэтому ссылка на http://guides.rubyonrails.org/layouts_and_rendering.html#using-nested-layouts не очень поможет.

Ответы [ 5 ]

18 голосов
/ 30 июня 2011

Я перечитал ссылку, которую я разместил (http://guides.rubyonrails.org/layouts_and_rendering.html#using-nested-layouts) и понял, что пропустил ключевую деталь.

<%= render :file => 'layouts/application' %>

так, в Site::BaseController у меня есть звонок на layout 'site', а в /layouts/site.html.haml у меня

= content_for :footer do
   -#Content for footer
= render :file => 'layouts/application'

Затем в Site::BlogController, который распространяется Site::BaseController, у меня есть layout 'site/blog', а в /layouts/site/blog.html.haml у меня

=content_for :header do
  %h1 HELLO WORLD!

= render :file => 'layouts/site'

Затем рендеринг размещается так, как описано в вопросе. Извините, что пропустил это в моем вопросе. Я должен был прочитать ближе.

7 голосов
/ 31 октября 2013

если вы создадите помощника, подобного этому:

# renders a given haml block inside a layout
def inside_layout(layout = 'application', &block)
  render :inline => capture_haml(&block), :layout => "layouts/#{layout}"
end

тогда вы можете определить подслой следующим образом:

= inside_layout do
  # nested layout html here
  = yield

эти макеты можно использовать как обычные макеты.

больше: http://www.requests.ch/blog/2013/10/30/combine-restful-rails-with-nested-layouts/

2 голосов
/ 10 августа 2012

Полагаю, самый простой способ сделать это - добавить эту строку кода в родительский элемент вложенного макета:

((render "layouts/#{controller_name}" rescue nil)|| yield )

Вы можете добавить столько вложенных макетов, сколько захотите, только изменив путь к каталогу следующего макета, который будет отображаться.

note : убедитесь, что ваш вложенный макет имеет имя _layoutname.whither и что ваш вложенный макет имеет выход внутри

2 голосов
/ 30 июня 2011

Я сделал подобное, но использовал только 1 уровень подуровней.Может быть легко настроен на несколько уровней.

In controllers / application_controller.rb:

def sub_layout
  nil
end

В контроллере (например, blog_controller.rb):

def sub_layout
  "blog"
end

В layouts / application.html.erb вместо <%=yield%>:

<%= controller.sub_layout ? (render :partial => "/layouts/#{controller.sub_layout}") : yield %>

Создайте частичный layouts/_blog.html.erb:

...code
  <%=yield%>
...code

Повторите для других контроллеров и вспомогательных макетов.

РЕДАКТИРОВАТЬ: Если вам нужно сделать это для каждого действия:

def sub_layout
  {
    'index' => 'blog',
    'new' => 'other_sub_layout',
    'edit' => 'asdf'
  }[action_name]
end
0 голосов
/ 26 сентября 2013

Вы можете создать частичное с доходностью в нем.

_my_sub_layout.html.erb:

<h3>I'm a sub layout and here's my content:</h3>
<%= yield %>

В другом представлении или даже в вашем основном макете application.html.erb отображает частичное в виде макета:

<%= render layout: 'my_sub_layout' do %>
  <p>I'm the sub layout's content</p>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...