Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Best practices for grails index page

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?

like image 888
danb Avatar asked Oct 13 '08 20:10

danb


3 Answers

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 ]
    }
}
like image 114
Ed.T Avatar answered Oct 23 '22 10:10

Ed.T


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.

like image 29
William Pietri Avatar answered Oct 23 '22 09:10

William Pietri


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.

like image 4
Robert Fischer Avatar answered Oct 23 '22 09:10

Robert Fischer