2013-12-09 3 views
8
내가 할 수있는 방법을 찾는 데 문제가

다음은 :레일 4 중첩 레이아웃

이의 내가

<div id="one" > 
    <%= yield %> 
</div> 

다음 한 내 application.html.erb에 가정 해 봅시다 그러면 나는 또 다른 갖고 싶어 레이아웃 파일은

<div id="two"> 
    <%= yield %> 
</div> 

asdf.html.erb 나는 최종 출력이 원하는

<div id="one> 
    <div id="two"> 
     <%= yield %> 
    </div> 
</div> 

가능합니까? 감사.

답변

7

application.html.erb이 레이아웃입니다.

<div id="one> 
    <div id="two"> 
     <%= yield %> 
    </div> 
</div> 

또는, 당신이 찾고 있다면 다음

# app/views/layouts/application.html.erb 
<div id="one" > 
    <%= render "layouts/asdf" %> 
</div> 

# app/views/layouts/_asdf.html.erb 
<div id="two"> 
    <%= yield %> 
</div> 

이 출력됩니다 : 당신은 당신의 응용 프로그램 레이아웃에서 부분으로 호출하여 기본 하위 레이아웃을 렌더링 할 수 조건부로 렌더링 레이아웃을 컨트롤러 단위로 렌더링하려면 nested layouts을 사용해야합니다. NewsController가에 의해 생성 된 페이지에

, 당신은 상단 메뉴를 숨기고 오른쪽 메뉴를 추가 할 : 문서에서

# app/views/layouts/news.html.erb 
<% content_for :stylesheets do %> 
    #top_menu {display: none} 
    #right_menu {float: right; background-color: yellow; color: black} 
<% end %> 
<% content_for :content do %> 
    <div id="right_menu">Right menu items here</div> 
    <%= content_for?(:news_content) ? yield(:news_content) : yield %> 
<% end %> 
<%= render template: "layouts/application" %> 

뉴스보기 새로운 레이아웃을 사용하는 것, 숨어 상위 메뉴를 열고 "content"div 안에 새로운 오른쪽 메뉴를 추가하십시오.

+0

그렇다면 레이아웃 이름을 얻는 방법은 무엇입니까? 'layout == 'application'과 같은 것을 기대할 수 있습니까? yield : render layout' –

8

내가 지금까지에 의해 을 발견 깨끗한 솔루션이의 repo에서 온 : https://github.com/rwz/nestive

내가 모든 보석을 원하지 않았다. 나 같은 경우, 여기에 내가 원하는 내가 무엇을 달성하는 방법은 다음과 같습니다

# application_helper.rb 

    # From https://github.com/rwz/nestive/blob/master/lib/nestive/layout_helper.rb 
    def extends(layout, &block) 
    # Make sure it's a string 
    layout = layout.to_s 

    # If there's no directory component, presume a plain layout name 
    layout = "layouts/#{layout}" unless layout.include?('/') 

    # Capture the content to be placed inside the extended layout 
    @view_flow.get(:layout).replace capture(&block) 

    render file: layout 
    end 

은 그럼 당신은 변경되지 /layouts/application.html.erb을 유지!

그리고 다른 레이아웃을 만들 수 있습니다. /layouts/public.html.erb 내 경우와 /layouts/devise.html.erb : 마법처럼

# public.html.erb 
<%= extends :application do %> 
    <%= render 'partials/navbar' %> 
    <div class="container margin-top"> 
    <%= yield %> 
    </div> 
<% end %> 

# devise.html.erb 
<%= extends :public do %> 
    <div class="col-sm-6 col-sm-offset-3"> 
    <%= yield %> 
    </div> 
<% end %> 

작품! 나는 아직도 웃으며 깨끗한 해결책을 찾았습니다.

+0

오늘 귀하의 의견을 발견하고 즉시 고용했습니다. 매우 유용합니다. 고마워요! – dimitarvp

1

당신은 또한 할 수있는 조건 하위 레이아웃 렌더링하려면 다음 단 하나의 서브 레이아웃 시나리오에 대한

# app/views/layouts/application.html.erb 
<%= controller.controller_name.include?("foo") ? render("layouts/foo") : yield %> 

# app/views/layouts/_foo.html.erb 
<div class="bar"> 
    <%= yield %> 
</div> 

을, 나는 찾아 Rails guide 때문에 실행에 설명 된 중첩 된 레이아웃 방식이 바람직 하위 레이아웃에서 주 레이아웃으로 이동 한 다음 하위 레이아웃으로 돌아갈 필요가 없습니다. 대신 메인 레이아웃에서 시작하여 하위 레이아웃으로 진행 한 다음보기에서 끝나 더 자연스럽게 흐릅니다.

0

application.html.erb를 상속받은 요소에 연결하지 않는 깨끗한 솔루션을 찾고 있다면 보석 네이티브 (다른 용도에서 사용 된 것처럼 지적되었지만 작동하지 않는 것으로 나타남) 레일 (5)과 함께하지만이 그것을 할 수있는 또 다른 방법입니다. https://mattbrictson.com/easier-nested-layouts-in-rails

# Place this in app/helpers/layouts_helper.rb 
module LayoutsHelper 
    def parent_layout(layout) 
    @view_flow.set(:layout, output_buffer) 
    output = render(:file => "layouts/#{layout}") 
    self.output_buffer = ActionView::OutputBuffer.new(output) 
    end 
end 

그런 다음 asdf.html.erb

<div id="two"> 
    <%= yield %> 
</div> 
<% parent_layout 'application' %> 

이이 레일 내부에 의존하고 향후 버전에서 작동하지 않을 수 있음을주의 할 될이 곧 그렇게 될 가능성이 아주 적습니다. 3 년 이상 (링크 된 블로그 게시물의 날짜를 기준으로) 작업했습니다.