Проблема Grails с плагином ShoppingCart

Я пытаюсь использовать плагин корзины покупок Grails, найденный здесь: http://grails.org/plugin/shopping-cart

Мне удалось успешно установить плагин в свое приложение, а также внедрить службу в свой контроллер:

class TestController {
def shoppingCartService

def index() {

    def s = new DomainObj(name: "A Plain Ole Domain Object")
    s.addToShoppingCart()
 }
}

Похоже, продукт добавляется в мою корзину, как я и ожидал. Однако проблема, с которой я сейчас сталкиваюсь, заключается в том, что на самом деле перечисляются товары, выпавшие из корзины. Согласно отладчику, после выполнения вышеуказанного кода в корзине действительно есть товар (ы), поскольку он возвращает:

com.metasieve.shoppingcart.ShoppingItem : 1

Товар правильно добавляется в корзину, но теперь я хотел бы снова перечислить имя элемента, поэтому в этом случае я хочу отобразить имя A Plain Ole Domain Object. Как мне это сделать?

Я не уверен в синтаксисе получения реальных объектов из тележки. В документации не описывается, как это сделать, а просто говорится, что следующее должно работать:

def checkedOutItems = shoppingCartService.checkOut()

checkedOutItems.each { 
println it['item'] 
println it['qty'] 
}

Но это выводит com.metasieve.shoppingcart.ShoppingItem : 1, который является лишь ссылкой на какой-то произвольный товар в корзине. Я хочу вернуть фактическое название моего предмета.

Заранее спасибо.

РЕДАКТИРОВАТЬ:

Мой доменный класс (DomainObj) определяется следующим образом:

class DomainObj extends com.metasieve.shoppingcart.Shoppable {
String name

static constraints = {
name blank: false
}
}

РЕДАКТИРОВАТЬ № 2:

def index() {

    def s = new DomainObj(name: "A Plain Ole Domain Object")
    s.addToShoppingCart()
    def r = new DomainObj(name: "Second Plain Ole Domain Object")
    r.addToShoppingCart()

    def checkedOutItems = shoppingCartService.checkOut()


   println currentItems
    println "-----"

    checkedOutItems.each {
        println it['item']
        println it['qty']
    }
}

Результатом этого является:

[com.metasieve.shoppingcart.ShoppingItem : 1, com.metasieve.shoppingcart.ShoppingItem : 2]

com.metasieve.shoppingcart.ShoppingItem : 2

1

com.metasieve.shoppingcart.ShoppingItem : 1

1


person meoww-    schedule 20.01.2014    source источник


Ответы (1)


Согласно документации, он ["item"] возвращает вам сущность доменного класса, расширяющего Shoppable. Итак, в этом случае, когда вы распечатываете его, он вызывает метод toString () этого класса домена. Если вы хотите, чтобы возвращалось значение свойства name, вам необходимо реализовать свой собственный toString (). Вот такой пример

@Override
String toString() {
  return name
}

РЕДАКТИРОВАТЬ: Ну, поскольку из документации не ясно, что ['item'] - это указатель на экземпляр Shoppable, который затем можно использовать для запроса фактического продукта в корзине следующим образом:

com.metasieve.shoppingcart.Shoppable.findByShoppingItem(it['item'])

Таким образом, следующее будет распечатывать значение toString () ваших продуктов.

checkedOutItems.each {
  println com.metasieve.shoppingcart.Shoppable.findByShoppingItem(it['item'])
  println it['qty']
}

Для тестирования я создал следующий домен и контроллер.

Домен:

package com.test

class MyProduct extends com.metasieve.shoppingcart.Shoppable {
    String name

    static constraints = {
        name(blank: false)
    }

    @Override
    String toString() {
        return name
    }
}

Контроллер:

package com.test

class MyProductController {

    def shoppingCartService

    def index() { 
        def p1 = new MyProduct(name: 'one')
        p1.save(flush: true, failOnError: true)
        p1.addToShoppingCart()
        def p2 = new MyProduct(name: 'two')
        p2.save(flush: true, failOnError: true)
        p2.addToShoppingCart()

        def checkedOutItems = shoppingCartService.checkOut()
        checkedOutItems.each {
           println com.metasieve.shoppingcart.Shoppable.findByShoppingItem(it['item'])
           println it['qty']
        }
    }
}
person Joshua Moore    schedule 20.01.2014
comment
Привет, Джошуа, Спасибо за ответ. Я попробовал это, добавив @Override String toString (), возвращающий имя, как вы указали выше. Однако, похоже, это не повлияло на результат. Для печати это ['item'] он по-прежнему показывает com.metasieve.shoppingcart.ShoppingItem: ‹shopping_item_id› `. - person meoww-; 20.01.2014
comment
@ meoww - ваш доменный класс расширяет com.metasieve.shoppingcart.Shoppable, верно? - person Joshua Moore; 20.01.2014
comment
Привет, Джошуа, еще раз спасибо. Да, мой предметный класс расширяет Shoppable. Я отредактировал вопрос, чтобы вы могли видеть мой домен. Спасибо, что пытались со мной разобраться с этим. - person meoww-; 20.01.2014
comment
@ meoww- Не беспокойся. Я копаюсь в исходном коде, и все, что у вас есть, похоже, в точности похоже на пример / тестовый продукт: svn.codehaus.org/grails-plugins/grails-shopping-cart/trunk/ на случай , вы пробовали очистить грааль? - person Joshua Moore; 20.01.2014
comment
Привет, Джошуа, еще раз спасибо. Я только что попробовал очистить grails. Я также добавил второй объект, просто чтобы посмотреть, что произойдет. Теперь я вижу текст [com.metasieve.shoppingcart.ShoppingItem : 1, com.metasieve.shoppingcart.ShoppingItem : 2] Я убедился, что метод @Override String toString () тоже существует. Пока не повезло. Грм. - person meoww-; 20.01.2014
comment
@ meoww - это как-то указывает на коллекцию. Это то, что для него [item] печатается? - person Joshua Moore; 20.01.2014
comment
Привет, Джошуа, я обновил свой вопрос с помощью Edit # 2, чтобы показать все действие над индексом контроллера. Я также обновил общие результаты на моей консоли ... Если это поможет? - person meoww-; 20.01.2014
comment
давайте продолжим обсуждение в чате - person Joshua Moore; 21.01.2014