Проблем с 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)


Според документацията it["item"] ви връща обекта на домейн клас, който разширява Shoppable. Така че в този случай, когато го отпечатвате, той извиква метода toString() на този клас домейн. Ако искате това да върне стойността на свойството name, трябва да имплементирате свой собствен toString(). Ето един такъв пример

@Override
String toString() {
  return name
}

РЕДАКТИРАНЕ: Тъй като не става ясно от документацията, it['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(), връщайки името, както сте включили по-горе. Въпреки това не изглеждаше да има ефект върху изхода. За print it['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/ случайно , пробвал ли си grails clean? - person Joshua Moore; 20.01.2014
comment
Здравей Джошуа, благодаря отново. Току що пробвах grails clean. Добавих и втори обект, само за да видя какво ще се случи. Сега виждам текста [com.metasieve.shoppingcart.ShoppingItem : 1, com.metasieve.shoppingcart.ShoppingItem : 2] Уверих се, че методът @Override String toString() все още съществува. Няма късмет досега. Хрм. - person meoww-; 20.01.2014
comment
@meoww- Това по някакъв начин би означавало колекция. Това ли се печата за it[item]? - person Joshua Moore; 20.01.2014
comment
Здравей Джошуа, актуализирах въпроса си с Редактиране #2, за да покажа цялото ми действие на индекса на контролера. Актуализирах и общите изходи на моята конзола сега...Ако това помага? - person meoww-; 20.01.2014
comment
нека да продължим тази дискусия в чата - person Joshua Moore; 21.01.2014