2013-10-30 43 views
1

我正在尝试向当前登录的用户(这是组织)添加类别和子类别。我可以将类别添加到用户(组织),但无法添加子类别。grails中的类别和子类别

协会:

Organization hasMany = [follows: SubCategory] 
Category hasMany = [ subCategories: SubCategory ] 
SubCategory belongsTo = [ category: Category] 

类别和子类别结构:

Main Category 
Sub Category 
Sub Category 
Sub Category 

Main Category 
Sub Category 
Sub Category 
Sub Category 

Main Category 
Sub Category 
Sub Category 
Sub Category 

注:当我选择的任何主要类别,它需要我与此相关的类别和我子类别列表想要选择并将这些subCategories添加到组织。

Organization.groovy

class Organization extends Party{ 

    String orgName 
    Person contact 
    String orgSize 
    boolean isVendor = false 

    static hasMany = [follows: SubCategory] 

    static constraints = { 
    orgName blank: false 
    orgSize blank: false 
    } 
} 

Category.groovy

class Category { 

    String name 
    String description 

    static constraints = { 
     subCategories nullable:true 
    } 

    static hasMany = [ subCategories: SubCategory ] 
} 

SubCategory.groovy

class SubCategory { 
    String name 

    static hasMany = [requirements: Enquiry] 
    static belongsTo = [ category: Category] 
    static constraints = { 
     requirements nullable:true 
    } 
} 
在上述控制器

OrganizationController.groovy

class OrganizationController { 

    def saltSource 
    def userCache 
    def springSecurityService 
    def mailService 
    def messageSource 
    def organizationService 
    def subscriberService 
    static allowedMethods = [save: "POST", update: "POST", delete: "POST"] 

    def index() { 
    redirect(action: "list", params: params) 
    } 

    def list() { 
     params.max = Math.min(params.max ? params.int('max') : 10, 100) 
     [organizationInstanceList: Organization.list(params), organizationInstanceTotal: Organization.count()] 
    } 

    def profile() { 
     Subscriber loggedinSubscriber = subscriberService.getLoggedinSubscriber() 
     Party organization = loggedinSubscriber?.customer?.party 
     Party person = organization?.contact 
     [orgInstance: organization, personInstance: person] 
    } 

    def update() { 
     def orgInstance = organizationService.getOrganization(params.id) 
     orgInstance.properties = params 
     orgInstance?.contact?.properties = params 
     println params 
     try { 
      organizationService.updateOrganization(orgInstance) 
     } 
     catch (CustomValidationException e){ 
      flash.message = e.sMessage 
     } 
     catch (ServiceException s) { 
      flash.message = s.message 
     } 
    render(view: "_org", model: [orgInstance: orgInstance]) 
    } 

    def follow() { 
     Subscriber loggedinSubscriber = subscriberService.getLoggedinSubscriber() 
     Party organization = loggedinSubscriber?.customer?.party 
     def subparams = params.subcategories 
     println subparams 
     def marketInstance = Category.get(params.abc) 
     def subMarket = getsubCategories(params.subcategories) 
     def follower = new Follower() 
     follower.followedBy = organization 
     follower.category = marketInstance 
     follower.subCategory = subMarket 
     follower.save(failOnError: true); 
     flash.msg = "Okay. This market is now on your watchlist." 
     redirect (action: "profile") 
    } 
} 

后续行动负责添加类别和子类别来组织(用户).I试图用下面的代码

DEF子市场= getsubCategories(params.subcategories) follower.subCategory =次级市场

在后续行动,但得到

No signature of method: com.vproc.member.OrganizationController.getsubCategories() is applicable for argument types: ([Ljava.lang.String;) values: [[2, 1, 3]] error. 

subCategory.gsp

<g:form controller="organization" params="[temp : marketInstance?.id]" action="follow" method="post"> 
       <g:hiddenField name="id" name= "abc" value="${marketInstance?.id}" /> 
       <g:hiddenField name="id" value="${subcategory?.id}" /> 
        <div style="margin-left:200px"> 
        <input type="button" class="button-inner" id="check1" value="Check All" /> 
        <input type="hidden" id="isChkd" value="true" /> 
        <g:each var="subcategory" in="${subCategroyInstanceList}"> 
        <div> 
        <g:checkBox class="cb1-element" name="subcategories" value="${subcategory.id}"/> 
        <label for="subcategories"> ${subcategory.name}</label> 
        </div> 
        </g:each> 
        <button class="btn btn-inverse">Submit</button> 
       </div> 
       </g:form> 

问题: 如何获得选定的子类别,并使用后续行动将它们添加到组织。

回答

0

您已经在使用相同name所有的复选框,这样在你控制器,你可以在列表中变换它:

def sub = params.list('subcategories') 
sub.each { id -> 
    ... //add to your organization. 
} 

这是ID的,你需要与你的Organization相关联的列表,所以如果你正在更新,你可能需要删除那些已经关联并且在添加新列表之前不在列表中的列表。

+0

嗨@ sergio-michels感谢您的回复。我试着用你的建议def sub = params.list('subcategories') sub.each {id - > follower.subCategory = sub }但是我得到的错误就像参数类型不匹配在follower.subCategory = sub。对此有任何建议。 –

+0

你只有id,所以你需要在添加到列表之前获取Subcategory实例。 –

+0

为了更清楚:'follower.addToSubCategories(SubCategory.get(id))' –