2011-06-30 9 views
13

グローバルアプリケーションレイアウトファイルapplication.html.hamlを持つアプリケーションがあります。私はその後、複数の「コントローラスタック」を持っています。メインサイト、管理ポータル、ビジネスサイトです。これらのそれぞれについて、コントローラはモジュール内にあり、すべて同じものから継承しますBaseController。各スタックには独自のレイアウトファイルがあります。スタック内には、レイアウトファイルもあるコントローラもあります。複数レベルのネストされたレイアウトをレールに3

アプリケーション、スタック、コントローラの複数のレベルのネストされたレイアウトをレンダリングするには、特に指定しない限り、すべてのビューが必要です。

例えば、Site::BlogController#showアクションのために、私はレールがレンダリングしたい:

/site/blog/show.html.haml私がスタックに/layouts/site.html.hamlを挿入する方法を理解する難しさを持っています

/layouts/application.html.haml内部/layouts/site.html.haml内部/layouts/site/blog.html.hamlの内側を。それは自動的に見えるように、レールはアプリケーションレイアウト内のコントローラレイアウト内でアクションをレンダリングしますが、レンダリングスタックにレイアウトを挿入する方法はわかりません。

私はすべてのレールガイドを無駄に読んでいますので、http://guides.rubyonrails.org/layouts_and_rendering.html#using-nested-layoutsへのリンクは本当に役に立たないでしょう。

答えて

18

私は私が投稿リンク(http://guides.rubyonrails.org/layouts_and_rendering.html#using-nested-layouts)を再読し、私はキーの詳細を逃した実現。

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

ので、Site::BaseControllerでIはlayout 'site'にコールを有し、/layouts/site.html.hamlに私はlayout 'site/blog'有するSite::BaseController延びSite::BlogController

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

次に有し、/layouts/site/blog.html.hamlでIは

=content_for :header do 
    %h1 HELLO WORLD! 

= render :file => 'layouts/site' 

を有しますこれにより、レイアウトがqの説明に従ってネストされます憂鬱。私の質問でこれを見逃して申し訳ありません。私はもっ​​と近くで読むべきだった。

+0

+1リンク。それは私が必要なすべてを持っています。 –

2

私は似たようにしましたが、サブレイアウトのレベルは1つしか使用しませんでした。簡単に複数のレベルを許可するために調整することができます。コントローラで

def sub_layout 
    nil 
end 

(例えばblog_controller.rb用):コントローラ/ application_controller.rbで

レイアウト/ application.html.erbなく<%=yield%>

def sub_layout 
    "blog" 
end 

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

部分的にするlayouts/_blog.html.erb

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

他のコントローラ&サブレイアウトについても同様です。

EDIT: あなたはアクション単位でこれを行う必要がある場合:

def sub_layout 
    { 
    'index' => 'blog', 
    'new' => 'other_sub_layout', 
    'edit' => 'asdf' 
    }[action_name] 
end 
+0

残念ながら、この方法は、より大きな入れ子構造に一般化するはるかに困難であるとカスタムコードのおよそまともなする必要があります。私はこのような解決策を避けようとしていました。 –

+0

また、この方法を使用していますが、アクションごとに必要な場合は3行が必要です。 – Rubytastic

+0

@Rubytastic編集を参照してください...かなりクール、ハァッか。 ;) – tybro0103

2

私はそれを行うための最も簡単な方法は、ネストされたレイアウトの親にこのコード行を追加することであると思います:

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

あなたが望むとおりにのみ、パスのディレクトリを変更することにより、できるだけ多くのネストされたレイアウトを追加することができますレンダリングされる次のレイアウトの

ノート:あなたのネストされたレイアウトが_layoutname.whatever命名されていることを確認して、ネストされたレイアウトが

+0

ここでは 'rescue nil'は非常に非常に悪いです:そのファイルのレンダリングで何らかのエラーが発生した場合、あなたは気付かないでしょう。あなたのユーザーの誰もあなたのサイトのメインページにアクセスできず、あなたは想像を絶するようなことをしません。 'rescue nil'の使用を中止してください。 – ecoologic

0

内部歩留まりを持っていることをあなたはそれで収率で部分的に作成することができます。

_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 %> 
7

あなたが作成した場合このようなヘルパー:

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

が、あなたはこのようにsublayout定義することができます。

= inside_layout do 
    # nested layout html here 
    = yield 

これらのレイアウトは通常のレイアウトのように使用できます。

より:http://www.requests.ch/blog/2013/10/30/combine-restful-rails-with-nested-layouts/

+1

これはありがとう、これは私たちが探していたものでした!また、 'HAMLエイリアス' capture_haml'から 'capture'へ(https://github.com/)ので、あなたは' capture(&block) 'を使ってこれを行うことができます。 haml/haml/blob/4.0.5/lib/haml/helpers/action_view_mods.rb#L56) – valscion

関連する問題