web-dev-qa-db-ja.com

Grailsは、レンダリングするページに「レイアウト」を適用することをどのように知っていますか?

「TheDefinitiveGuide to Grails」(ロシェ/ブラウン)という本を読んでいて、第04章では、「レイアウト」と呼ばれるこの不思議なものが説明なしで登場しました。 (そして、インデックスには「レイアウト」はありません。私が知る限り、それは決して説明されていません。)

システムは、layout/main.gspからページを「継承」することをどのように認識しますか?インデックスには「レイアウト」については何もありませんが、登場したばかりのようです。

彼らのサンプルアプリであるシンプルなストアサイトでは、/ホームページのURLマッピングは次のように述べています。

  "/"(controller:"store")

コントローラの空の「インデックス」クロージャを保存します

package com.g2one.gtunes

class StoreController {

    def index = {
    }
}

store /index.gspをレンダリングするように指示するだけです

Store /index.gspには数行のHTMLがあります。ディレクティブにはレイアウトは含まれません

<html>
    <head>
        <meta http-equiv="Content-type" content="text/html; charset=utf-8">
        <meta name="layout" content="main">
        <title>gTunes Store</title>
        <g:javascript library="prototype"></g:javascript>
    </head>
    <body id="body">
        <h1>Your online music store and storage service!</h1>
        <p>Manage your own library, browse music and purchase new tracks as they become available</p>
    </body> 
</html>

サンプルを実行すると、「/」に表示されるページはこの単純なHTMLだけでなく、この情報が魔法のように挿入された「layouts /main.gsp」のコンテンツです。

Layout/main.gspの情報がページにどのように適用されるか、要素がどのように混合されるかがわかりません。私は本を​​ページごとにフォローしてきましたが、この機能は説明なしで「表示」されました。

32
user122299

<meta name="layout" content="main">タグには、gspページのレイアウトが含まれています。

grails-app/views/layouts/main.gspを表示して、レイアウトを表示および変更できます。 main.gspmymain.gspにコピーして変更し、gspページのレイアウトエントリをmymain.gspではなくmain.gspを参照するように変更して、レイアウトのカスタマイズを試してみてください。変更を簡単に取り消すことができます。

Grailsは(休止状態とSpringを使用するように)カバーの下でsitemeshを使用してビューのレイアウトを行います。プロジェクトディレクトリにもweb-app/WEB-INF/sitemesh.xml設定ファイルがあります。この特定のファイルはそれほど役に立ちませんが、grailsがsitemeshをどのように使用しているかを深く理解したい場合は、groovyプロジェクトのクラスを参照します(これはおそらく必要ありません)。

49
Lloyd Meinholz

これがあなたの指示です:

<meta name="layout" content="main">

main.gspには<g:layoutHead><g:layoutBody>が含まれ、index.gspの<head><body>のコンテンツがレイアウトに折りたたまれて最終ページが作成されます。

14
John Stoneham

うまくいくように見える最近のトリックの1つです。コントローラーに一致するようにレイアウトに名前を付けると、(少なくともGrails 2.3.4では)そのテンプレートを自動的に使用するように見えます。

たとえば、私のコントローラー:

// grails-app/controllers/myapp/HomeController.groovy
package myapp
class HomeController {
    def index() {
        [ myvar: "Test" ]
    }
}

私のレイアウト:

// grails-app/views/layouts/home.gsp
<html>
  <head></head>
  <body>
    <h1>Home</h1>
    <g:layoutBody />
  </body>
</html>

私の見解:

// grails-app/views/home/index.gsp
<p>${ myvar }</p>

ホームレイアウトを使用してレンダリングします。

また、次のようにコントローラーですべてのアクションのレイアウトを指定できます。

class HomeController {
    static layout = "someotherlayout"

    // actions will render using grails-app/views/layouts/someotherlayout.gsp
}
6
GSP