レイアウト

レイアウトは、レンダリングの特別な景色、ある「固定」 HTMLマークアップの一部を。このページ(おそらくナビゲーション、サイドバー、ヘッダ、フッタなど)のページから変更しない部分であります

私たちは、新しいアプリケーションを生成すると、呼ばれるデフォルトのレイアウトがあるWeb::Views::ApplicationLayoutapps/web/templates/application.html.erbテンプレートが。これは非常に基本的なHTML5のワイヤーフレームが付属しています。



  
    Web
  
  
    <%= yield %>
  

最も興味深い部分があります<%= yield %>。これは、ビューの出力と、実行時に置き換えられています。
レンダリングの順序は、最初のビュー、そしてレイアウトです。

レイアウトテンプレートのコンテキストには、レイアウトと現在のビューで構成されています。後者は、より高い優先度を有しています。

次の行を想像<%= page_title %>。レイアウトとビューの両方を実装する場合はpage_title、花見は、ビューからいずれかを使用します。

 

設定レイアウト

デフォルトのレイアウトは、アプリケーションの設定で定義されています。

# apps/web/application.rb
module Web
  class Application < Hanami::Application
    configure do
      layout :application
    end
  end
end

花見は付加することで、アプリケーションの設定でレイアウト名を変換Layoutサフィックスを。例えば、layout :applicationに相当しますWeb::Views::ApplicationLayout

我々はビューのレイアウトを無効にしたい場合は、我々はそのためのDSLを使用することができます。

# apps/web/views/dashboard/index.rb
module Web::Views::Dashboard
  class Index
    include Web::View
    layout false
  end
end

我々は完全にこの機能をオフにしたい場合は、私たちが設定することができlayout nil、アプリケーションの設定の中に。

 

複数のテンプレートレイアウトを使用

時にはそれは、複数のレイアウトを持っていると便利です。たとえば、application.html.erbテンプレートは、ナビゲーション要素が含まれている、と私たちは完全に異なるレイアウトをしたい、ナビゲーション要素なしに、ログインページのために、我々は、作成することができlogin.html.erb、レイアウトテンプレートを。

我々が持っていると仮定するとWeb::Actions::UserSessions::New、ユーザーがログインするアクションを、我々は、作成することができlogin.html.erb、右隣のデフォルトのテンプレートをapplication.html.erbapps/web/templates/

その後、我々は新しい作成する必要がWeb::Views::LoginLayout新しいレイアウトテンプレートを使用するクラスを、。このファイルは名前を付けることができますapp/web/views/login_layout.rb(右隣デフォルトにapplication_layout.rb):

module Web
  module Views
    class LoginLayout
      include Web::Layout
    end
  end
end

今、私たちにapp/web/views/user_sessions/new.rb私たちは、あなたがこのビューのログインレイアウトを使用したい指定することができます。

module Web::Views::UserSessions
  class New
    include Web::View
    layout :login
  end
end

そして、我々は、追加することができlayout :login、これと同じレイアウトを使用する必要があり、このアプリ内の他のビューへ。

 

オプションの内容

時にはそれは、特定のページにのみコンテンツをレンダリングするために便利です。例えば、これは、ページ固有のjavascriptを持っているために使用することができます。

レイアウトのための次のテンプレートがあるとします。



  
  
    
    

      <%= local :javascript %>
    

 

次のビューを持ちます:

module Web::Views::Books
  class Index
    include Web::View
  end
end

そして

module Web::Views::Books
  class Show
    include Web::View

    def javascript
      raw %(/path/to/script.js)
    end
  end
end

最初のビューは、に応答しない#javascriptので、安全にそれを無視します。私たちの第二の目的は、( Web::Views::Books::Show)そのメソッドに応答し、その結果、最終的なマークアップに含まれます。