2014-04-05 20 views
6

Biorąc URLGrails 2.3.x: uzyskać wartość parametrów URL

http://localhost:9000/Estrategia/book/index?format=excel&extension=xls 

Chcę uzyskać wartość formatu (w tym przypadku jest Excel)

w kontrolerze:

`println params.format

Grails docs reference

Ale ja params.format s zawsze null, jakiś pomysł?

Grails 2.3.5

import static org.springframework.http.HttpStatus.* 
import grails.transaction.Transactional 

@Transactional(readOnly = true) 
class BookController { 

    static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"] 

    def exportService // Export service provided by Export plugin 
    def grailsApplication //inject GrailsApplication 

    def index(Integer max) { 
    params.max = Math.min(max ?: 10, 100) 

    if(!params.max) 
    params.max = 10 

    println params?.format 
    [ bookInstanceList: Book.list(params) ] 
    } 
} 
+1

Czy możesz dodać kontroler do pytania? – dmahapatro

+0

Gdzie jest 'foo'? W jaki sposób '/ hello? Foo = bar' jest mapowany do tego kontrolera? czy odnosiłeś się do 'params? .format'? Jaki jest rzeczywisty URL, który próbujesz trafić? * Problemem, który został dobrze wyjaśniony, jest problem rozwiązany w połowie * - Myślę, że zgodziłbyś się na to. :) – dmahapatro

Odpowiedz

5

Jesteś jednym z najszczęśliwszy ofiary Convention Over Configuration. ;)

Wpis z kluczem format został dodany do params zgodnie z domyślnym mapowaniem adresów URL, który reprezentuje oczekiwany typ odpowiedzi (ogólnie, czy xml/json) będzie również używany do negocjacji treści, co oznacza, że na przykład, jeśli używasz:

http://localhost:9000/Estrategia/book/index.xml 
//params -- [action:index, format:xml, controller:book] 

http://localhost:9000/Estrategia/book/index.json 
//params -- [action:index, format:json, controller:book] 

http://localhost:9000/Estrategia/book/index.json?format=excel&extension=xls 
//params -- [action:index, format:json, extension:xls, controller:book] 

http://localhost:9000/Estrategia/book/index?format=excel&extension=xls 
//params -- [action:index, format:null, extension:xls, controller:book] 

format zostaje wypełniona przez typ zawartości prosicie. Co oznacza także, że parametr żądania o nazwie format zostanie nadpisany i zostanie utracony.

Możesz zmienić nazwę parametru żądania na coś innego niż format, wtedy powinna być dostępna w kontrolerze, na przykład param.blah, jeśli parametr żądania ma blah=excel.

LUB

zmodyfikować mapowanie adresu URL i wyjąć opcjonalny (.$format)? jeśli nie jest wymagane:

"/$controller/$action?/$id?(.$format)?"{ 
    constraints { 
     // apply constraints here 
    } 
} 
+0

Dziękuję za całą waszą cierpliwość i bardzo dobrze wyjaśnione odpowiedzi. Wydaje mi się to dziwne, ponieważ używałem wtyczki Grails [Grails Export plugin] (http://grails.org/plugin/export) – Alberici

+0

Tak, widzę, że 'params.format' jest używany w wtyczce. Wtyczka jest zbyt stara. W tej chwili, jeśli to możliwe, zmodyfikuj mapowanie, będę pracował nad PR dla wtyczki, aby dostosować się do nowszych wersji Grails. – dmahapatro

+1

Kolejna strona StackOverflow, która może zainteresować każdego: http://stackoverflow.com/questions/19961339/grails-export-plugin-dont-download-any-file – Alberici

0

od format jest żeton przez platformę Grails, znajdziesz inną metodę, aby rozwiązać ten problem poprzez dodanie mapExtensionFormat varaible:

static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"] 
static mapExtensionFormat=['pdf':'pdf','xls':'excel','csv':'csv','rtf':'rtf'] 
def exportService // Export service provided by Export plugin 
def grailsApplication //inject GrailsApplication 

Następnie: