【问题标题】:Grails Issue with ShoppingCart pluginShoppingCart 插件的 Grails 问题
【发布时间】:2014-01-20 18:07:31
【问题描述】:

我正在尝试使用此处找到的 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

【问题讨论】:

    标签: grails grails-plugin


    【解决方案1】:

    根据文档,it["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']
            }
        }
    }
    

    【讨论】:

    • 您好 Joshua,感谢您的回复。我尝试了这个,通过添加 @Override String toString() 返回名称,正如您在上面包含的那样。不过,它似乎对输出没有影响。对于 print it['item'] 它仍然显示 com.metasieve.shoppingcart.ShoppingItem : ` .
    • @meoww- 您的域类确实扩展了 com.metasieve.shoppingcart.Shoppable 对吗?
    • 嗨,Joshua,再次感谢。是的,我的域类确实扩展了 Shoppable。我编辑了问题,以便您可以看到我的域。感谢您尝试与我一起解决这个问题。
    • @meoww- 不用担心。我在源代码中四处寻找,您所拥有的一切似乎与示例/测试产品完全一样:svn.codehaus.org/grails-plugins/grails-shopping-cart/trunk/… 碰巧,您尝试过 grails clean 吗?
    • 嗨,Joshua,再次感谢。我刚刚尝试了grails clean。我还添加了第二个对象,只是为了看看会发生什么。我现在看到了 [com.metasieve.shoppingcart.ShoppingItem : 1, com.metasieve.shoppingcart.ShoppingItem : 2] 文本,我确保 @Override String toString() 方法仍然存在。到目前为止没有运气。小时。
    猜你喜欢
    • 1970-01-01
    • 2014-08-30
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多