Как вызвать Taglib как функцию в доменном классе - PullRequest
9 голосов
/ 29 января 2010

Мне нужно вызвать плагин Static Resources (http://www.grails.org/Static+Resources+Plugin) из класса моего домена.

Это прекрасно работает в контроллере:

 def tstLink = resourceLinkTo(dir:"docs/${identifier}",file:originalFileName)

но в доменном классе я получаю

Exception Message: No signature of method: static org.maflt.ibidem.Item.resourceLinkTo() is applicable for argument types: (java.util.LinkedHashMap) values: [[dir:docs/19e9ea9d-5fae-4a35-80a2-daedfbc7c2c2, file:2009-11-12_1552.png]] 

Полагаю, это общая проблема.

Так как же вы вызываете taglib как функцию в классе домена?

Ответы [ 2 ]

11 голосов
/ 29 января 2010

Я столкнулся с этой проблемой некоторое время назад для приложения, над которым я работал. В итоге я сделал вызов метки в сервисном методе:

class MyService {
   def grailsApplication //autowired by spring

   def methodThatUsesATag(identifier, originalFileName) {
      //This is the default grails tag library
      def g = grailsApplication.mainContext.getBean('org.codehaus.groovy.grails.plugins.web.taglib.ApplicationTagLib')

      g.resourceLinkTo(dir:"docs/${identifier}",file:originalFileName)
   }
}

Тогда в моем доменном классе я мог также получить доступ к сервису через пружинную автопроводку:

class MyDomain {
    String originalFileName
    def myService  //autowired

    static transients = ['myService'] //Necessary so that GORM doesn't try to persist the service instance.

    //You can create a method at this point that uses your
    //service to return what you need from the domain instance.
    def myMethod() {
       myService.methodThatUsesATag(id, originalFileName)
    }
}
0 голосов
/ 29 января 2010

Большинство тегов-библиотек полагаются на данные с контроллера, поэтому зачастую их невозможно использовать повторно, в то время как другие касаются логики представления, поэтому часто это не то, что вы хотели бы поместить в класс домена.

Тем не менее, я уверен, что у вас есть свои причины, поэтому, возможно, источник taglib поможет:

class ResourceTagLib  {

    def externalResourceServerService

    def resourceLinkTo = { attrs ->
        out << externalResourceServerService.uri
        out << '/'
        if(attrs['dir']) {
            out << "${attrs['dir']}/"
        }
        if(attrs['file']) {
            out << "${attrs['file']}"
        }
    }
}

т.е. вставьте externalResourceServerService в класс вашего домена, а все остальное должно быть простым.

...