Search code examples
grailsgrails-orm

how to update the foreign key in grails


I have problem with update foreign key in a instance of my domain class Semester. I'm new in Groovy Grails. When I create new Semester everything is ok.

Semester.groovy

class Semester {

    int name
    Season season
} 

Season.groovy

class Season {

    String name
}

SemesterController.groovy

SemesterController{

   def update(){
        def semester = Semester.get(params.id)
        semester.name = params.semester
        semester.season = params.season // Here is a problem !!
        semester.save(flush: true)
        redirect(uri: "/semester/index")
    }
}

edit.gsp

<!DOCTYPE html>
<html>
<head>
<meta name="layout" content="bootstrap-main" />
<title>SARNA</title>
</head>
<body>
    <br />
    <div class="container">
        <g:form class="form-horizontal" role="form"
            url="[resource:semester,  controller: 'Semester']">

            <label for="semester" class="col-sm-2 control-label">Semestr</label>
            <g:textField class="form-control" name="semester"
                value="${semester.name}" />
            <g:select  name="season" from="${com.sarna.entity.Season.list()}" optionKey="id"
                optionValue="name" value="${semester?.season?.id}"/>

            <g:actionSubmit class="btn btn-primary" value="Zapisz"
                action="update" />
        </g:form>

    </div>

</body>
</html>

When I'm trying save changes I have this Exception:

URI: /SARNA/semester/index/1
Class: java.lang.IllegalStateException
Message: Cannot convert value of type [java.lang.String] to required type [com.sarna.entity.Season] for property 'season': no matching editors or conversion strategy found

What am I doing wrong ? Could you help me? Thanks


Solution

  • Make the following changes to the form

        <g:form class="form-horizontal" role="form"
            url="[resource:semester,  controller: 'Semester']">
    
            <g:hiddenField name="id" value="${semester.id}"/>
    
            <label for="semester" class="col-sm-2 control-label">Semestr</label>
            <g:textField class="form-control" name="name" value="${semester.name}" />
            <g:select name="season.id" from="${com.sarna.entity.Season.list()}" optionKey="id"
                optionValue="name" value="${semester?.season?.id}"/>
    
            <g:actionSubmit class="btn btn-primary" value="Zapisz"
                action="update" />
        </g:form>
    

    You can then simplify your action to:

    SemesterController{
    
       def update(Semester semester){
            semester.save(flush: true)
            redirect(uri: "/semester/index")
        }
    }