2013-12-09 8 views
8

私はトラブル次の操作を行うための方法を見つけることを持っている:レール4つのネストレイアウト

は、その後、私は別のものを持っているしたい私は、次の

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

を持っているのは、私のapplication.html.erbにしましょう私は最終的な出力が

<div id="one> 
    <div id="two"> 
     <%= yield %> 
    </div> 
</div> 
になりたい

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

asdf.html.erbレイアウトファイル

可能ですか?ありがとう。

答えて

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

私はこれまででを発見したクリーンなソリューションは、このレポから来た: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を継承している要素に結合しないクリーンなソリューションを探しているなら、宝石ネスト(他のもので指摘されているように、それは動作するようには思われませんでした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' %> 

これはRailsの内部に依存していると、それは将来のバージョンで働いて停止する場合がありますので注意してこのようになります。レール5.しかし、これはそれを行うための別の方法であるとすぐに起こる可能性は低いです少なくともリンクされたブログ記事の日付に基づいて3年間働いています。

関連する問題