「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の情報がページにどのように適用されるか、要素がどのように混合されるかがわかりません。私は本をページごとにフォローしてきましたが、この機能は説明なしで「表示」されました。
<meta name="layout" content="main">
タグには、gspページのレイアウトが含まれています。
grails-app/views/layouts/main.gsp
を表示して、レイアウトを表示および変更できます。 main.gsp
をmymain.gsp
にコピーして変更し、gspページのレイアウトエントリをmymain.gsp
ではなくmain.gsp
を参照するように変更して、レイアウトのカスタマイズを試してみてください。変更を簡単に取り消すことができます。
Grailsは(休止状態とSpringを使用するように)カバーの下でsitemeshを使用してビューのレイアウトを行います。プロジェクトディレクトリにもweb-app/WEB-INF/sitemesh.xml
設定ファイルがあります。この特定のファイルはそれほど役に立ちませんが、grailsがsitemeshをどのように使用しているかを深く理解したい場合は、groovyプロジェクトのクラスを参照します(これはおそらく必要ありません)。
これがあなたの指示です:
<meta name="layout" content="main">
main.gspには<g:layoutHead>
と<g:layoutBody>
が含まれ、index.gspの<head>
と<body>
のコンテンツがレイアウトに折りたたまれて最終ページが作成されます。
うまくいくように見える最近のトリックの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
}