2013-02-13 3 views
2

enter image description here Как написать параметры, чтобы я мог сгенерировать его в HTML-выбор? Проблема с этим «вариантам» требует набора, а не массивакак написать набор для g: select tag

Вот и все, что у меня есть. Я знаю, что соглашение об именах плохое, и я это исправлю, но сейчас я уже много лет занимаюсь этой проблемой.

контроллер класса

import org.springframework.dao.DataIntegrityViolationException 
import grails.plugin.mail.* 

class EmailServiceController { 

    static defaultAction = "contactService" 

def contactService() { 
    def options = new ArrayList() 
    options.push("Qestions about service") 
    options.push("Feedback on performed service") 
    options.push("Other") 
    options.push("Why am I doing this") 
    options 
} 

    def send() { 
     sendMail(){ 
      to "[email protected]" 
      from params.email 
      subject params.subject 
      body params.information 
     } 
    } 
} 

класс Domain

class EmailService { 

    static constraints = { 
    } 
} 

г: выберите вызов из GSP

<g:select name = "subject" from = "${options}" noSelection="Topic"/> 

также попытался следующие с "$ {выберите Функции}" вместо " $ {options} "без везения

def selectOptions() { 
    def options = new ArrayList() 
    options.push("Qestions about service": "QAS") 
    options.push("Feedback on performed service":"FoPS") 
    options.push("Other":"Other") 
    options.push("Why am I doing this":"WHY") 
    return options 
} 
+1

Почему вы думаете, что вы нуждаетесь в 'Set' вместо' list'? – doelleri

+0

Трассировка стека @doelleri: Нет сигнатуры метода: java.lang.String.entrySet() применим для типов аргументов:() значения: [] Возможные решения: toSet(), toSet(), getBytes(), each() –

ответ

6

Хорошо, я думаю я мог бы узнайте, что здесь происходит. Отсутствующая часть вопроса - это вызов gsp. Вот подходящий способ:

class EmailServiceController { 

    def contactService() { 
    def options = ["Qestions about service", "Feedback on performed service", "Other"] 
    // assumes you are going to render contactService.gsp 
    // you have to push the options to the view in the request 
    [options:options] 
    } 

} 

И тогда в contactService.gsp вы бы:

<g:select name="subject" from="${options}" noSelection="['Topic': 'Topic']"/> 
0

Вам нужно использовать двойные кавычки в ваших тегах, а не одинарные кавычки. С одинарными кавычками вы просто передаете строку, которая выглядит как '${options}' вместо передачи GString со значением options.

<g:select name="subject" from="${options}" noSelection="Topic"/> 

Кроме того, при условии, что вы звоните в contactService действие, необходимо return options вместо возвращения options.push("Other"). push() возвращает логическое значение, что означает неявный возврат contactService является логическим результатом push() вместо options.

+0

Что такое html, который говорит , где у вас есть имя и значение? –

+0

Что относительно HTML? Здесь мы не имеем дело с каким-либо прямым HTML. – doelleri

+0

см. Отредактированный вопрос .. Тот же результат. Stacktrace: Нет сигнатуры метода: java.lang.String.entrySet() применим для типов аргументов:() значения: [] Возможные решения: toSet(), toSet(), getBytes(), every() –

3

Ваш options не является ни массивом, ни картой. Существует синтаксическая ошибка. Вот почему у вас есть только один вариант в вашем выборе. Вам нужно ввести либо реальный список или карту, как это:

def selectOptions() { 
    def options = [:] 
    options["Qestions about service"] = "QAS" 
    options["Feedback on performed service"] = "FoPS" 
    [options:options] 
} 

Используя карту, которую вы можете использовать его в представлении, как это:

<g:select name="subject" from="${options.entrySet()}" 
    optionValue="key" optionKey="value" 
    noSelection="['Topic': 'Topic']"/> 
+0

Получил ошибку Невозможно вызвать метод entrySet() для нулевого объекта –

+0

Вы передали параметры Array в представление? – Chris

+0

См. Обновленный ответ – Chris