views:

4153

answers:

3

What is the right way to populate the model for the index page in a grails app? There is no IndexController by default, is there some other mechanism for getting lists of this and that into the model?

+4  A: 

The good answer: If you need to populate a model for the index page, it's time to change from using a straight index.gsp to an index controller.

The evil answer: If you create a filter whose controller is '*', it'll get executed even for static pages.

Robert Fischer
+11  A: 

I won't claim that this is the right way, but it is one way to start things off. It doesn't take much to have a controller be the default. Add a mapping to UrlMappings.groovy:

class UrlMappings {
    static mappings = {
      "/$controller/$action?/$id?"{
            constraints {
                // apply constraints here
            }
        }
      "500"(view:'/error')
     "/"
        {
            controller = "quote"
        }
    }
}

Then add an index action to the now default controller:

class QuoteController {

    def index = {
        ...
    }
}

If what you want to load is already part of another action simply redirect:

def index = {
    redirect(action: random)
}

Or to really get some reuse going, put the logic in a service:

class QuoteController {

    def quoteService

    def index = {
        redirect(action: random)
    }

    def random = {
        def randomQuote = quoteService.getRandomQuote()
        [ quote : randomQuote ]
    }
}
Ed.T
very complete! thanks.
danb
+7  A: 

I couldn't get Ed T's example above to work. Perhaps Grails has changed since then?

After some experimentation and some rummaging on the net, I ended up with this in UrlMappings.groovy:

    "/"(controller: 'home', action: 'index')

My HomeController looks like this:

class HomeController {

  def index = {
    def quotes = = latest(Quote.list(), 5)
    ["quotes": quotes, "totalQuotes": Quote.count()]
  }

}

And in views/home, I have an index.gsp file. That makes the index.gsp file in views unnecessary, so I removed it.

William Pietri