How to Render a Grails View Without a Layout - grails

If you have a controller action, but don't want the view to be rendered with the default layout (in my case layout/main.gsp), is there a render option you can enter into the controller action or something similar?
def comingSoon {
static layout = none; //not correct, but something like this?
}

In your view file, you might see something like this
<html>
<head>
<meta name="layout" content="main"/> // delete this line
<title>Coming Soon</title>
</head>
...
Remove the meta tag with the name="layout". This meta tag is the one that tells sitemesh to use the main layout

Without more details it's difficult to say 100% what case you are in so I'll attempt to answer both.
If you are using dynamically scaffolded views then you'll need to generate the GSPs so you can remove the <meta name="layout" tag from them. This will keep any layout from being used.
Alternatively you could alter the scaffolding templates (within the scaffolding plugin) to include some additional logic about not applying a layout when the domain class has some static property (as your question contains).

You can remove <meta name="layout" content="main"/> to vanish exists layout. Or you may customize layout by edit that main.gsp page in your-project\grails-app\views\layouts\

Related

grails layout nested pages

I am trying to include one gsp into another but avoid the navbar that I have in the layout rendered twice. Below is my attempt to show this as briefly as possible.
main.gsp
...
<g:render template="dashboardNavbar"></g:render>
...
page1.gsp
...
<meta name="layout" content="main"/>
...
page2.gsp
...
<meta name="layout" content="main"/>
<g:include action="page1"></g:include>
...
Page2 needs to be on its own so removing the meta tag is out of the question. I tried adding g:if block with a flag to control the rendering of the navbar template in main.gsp and pass that flag to the include directive as model but that causes both the navbars to disappear. Not sure why that happens. Any suggestions?
Why don't you extract meta section from page1.gsp and save whole content as a separate template, which will be rendered either page1 or page2:
page1.gsp
...
<meta section for page1/>
<g:render template="contentDuplicatedInGsp1AndGsp2"></g:render>
...
page2.gsp
...
<meta section for page2/>
<g:render template="contentDuplicatedInGsp1AndGsp2"></g:render>
...
Of course remember to set apropriate variables in controller before rendering page2.gsp

Config attributes in <html> with Rails

Generally Rails main application views/layout omits the <html> tag, focusing on defining what should be inside of it, like the <head> and <body> tags.
What I'm actually trying to do is to define a simple attribute inside of the <html> top level tag, but I don't know where to write it.
Any tips?
It's available in application.html.erb in the views/layout folder
This file in included by default in all your views.

grails how to debug sitemesh inclusion

I've got the line:
static layout = "loggedIn"
in one controller, and the loggedIn.gsp layout is used for views in this controller. I included the same line in another controller, but it doesn't include this layout, rather using main.gsp in the layouts folder. Any thoughts on how I can resolve this / figure out what is going on? Note loggedIn.gsp is in the layouts folder, it is just ignored by the second controller for some reason, which includes the exact same
static layout = "loggedIn"
line
I'd guess that the view has a meta.layout property in it.
Layouts get triggered in this order of precedence:
meta.layout <meta name="layout" content="main"/>
static 'layout' property on the controller
controller/action conventions:
/layouts/${controller}/${action}.gsp
/layouts/${controller}.gsp
configured grails.sitemesh.default.layout property
/layouts/application.gsp
http://www.slideshare.net/laelfrog/grails-layouts-sitemesh (slide 19)
It turns out I had a remnant:
<meta name="layout" content="main" />
in pages for the second controller, which overrides the static layout setting inside the controller.

ASP.NET MVC 3 RAZOR Style

how to use style block in a view ?
#<Style>
...
</Style>
You have to create a RenderSection in the head of your Layout, then add section to that content in a view. See this article: http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx
(Hopefully this will help the next Google visitor who gets this unanswered question first.)
style block only valid under <head> tag. if u use master page, just add content template in <head> tag
As the example:
<head>
<style>
...
</style>
</head>

How does Grails know to apply a "layout" to pages it renders?

I've been going through the book "The Definitive Guide to Grails" (Rocher/Brown) and in Chapter 04, this mysterious thing called a "layout" just appeared with no explanation. (And there's no "layout" in the index. As far as I know, it's never explained.)
How does the system know to "inherit" the pages from layout/main.gsp? There's nothing about "layouts" in the index, and it seems to have just appeared.
On their sample app, a simple store site, the URL mappings for the / homepage say
"/"(controller:"store")
and store controller's empty "index" closure
package com.g2one.gtunes
class StoreController {
def index = {
}
}
simply tells it to render store/index.gsp
The store/index.gsp just has a few lines of HTML; no layout gets included with any directive
<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>
When I run the sample the page shown for "/" isn't just this simple HTML, it's the contents of "layouts/main.gsp" with this information magically inserted inside it.
I don't see how the information in layout/main.gsp gets applied to the page, how the elements get mixed together. I've been following through the book page by page and this functionality just "appeared" with no explanation.
The <meta name="layout" content="main"> tag includes the layout in the gsp page.
You can view the grails-app/views/layouts/main.gsp to view and modify the layout. You can copy main.gsp to mymain.gsp, modify it, then change layout entry in the gsp page to reference mymain.gsp instead of main.gsp and experiment with customizing your layout preserving your ability to easily back out your changes.
Grails uses sitemesh under the covers (like it uses hibernate and spring) to do view layouts. There is a web-app/WEB-INF/sitemesh.xml configuration file in the project directory as well. This particular file isn't that helpful, but it references a class in the groovy project if you wanted to deeply understand how grails is using sitemesh (this probably isn't necessary).
Here's your directive:
<meta name="layout" content="main">
main.gsp contains <g:layoutHead> and <g:layoutBody>, where the <head> and <body> content of the index.gsp are folded into the layout to create the final page.
One recent trick that appears to work, if you name your layout to match your controller it appears (in Grails 2.3.4 at least) to automatically use that template.
For example, my controller:
// grails-app/controllers/myapp/HomeController.groovy
package myapp
class HomeController {
def index() {
[ myvar: "Test" ]
}
}
my layout:
// grails-app/views/layouts/home.gsp
<html>
<head></head>
<body>
<h1>Home</h1>
<g:layoutBody />
</body>
</html>
my view:
// grails-app/views/home/index.gsp
<p>${ myvar }</p>
renders using the home layout.
Also, you can specify a layout for all your actions in a controller like this:
class HomeController {
static layout = "someotherlayout"
// actions will render using grails-app/views/layouts/someotherlayout.gsp
}

Resources