Проблема со звездным рейтингом RichUI - PullRequest
1 голос
/ 02 июля 2011

Я создаю систему рейтинга с плагином RichUI для Grails. Сначала у меня был следующий код:

class RatingController {

def springSecurityService

static scaffold = true

def rate = {
    def rating = params.rating
    def artist = Artist.get( params.id )
    def currentUser = currentUser()

    currentUser.addToRatings(new Rating(artist:artist, rating:rating)).save()
    render(template: "/artist/rate", model: [artist: artist, rating: rating])

    }

private currentUser(){
    return User.get(springSecurityService.principal.id)
}
}

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

class RatingController {

def springSecurityService

static scaffold = true

def rate = {
    def rating = params.rating
    def artist = Artist.get( params.id )
    def currentUser = currentUser()

    if(! currentUser.ratings.artist.contains(artist)){
        currentUser.addToRatings(new Rating(artist:artist, rating:rating)).save()
        render(template: "/artist/rate", model: [artist: artist, rating: rating])
    }

    else{
        currentUser.ratings.find{it.artist==artist}.rating = rating
        currentUser.save()
        render(template: "/artist/rate", model: [artist: artist, rating: rating])
    }
}

private currentUser(){
    return User.get(springSecurityService.principal.id)
}
}

Но с помощью этого кода, когда значение рейтинга присваивается новому рейтингу (params.rating) в блоке «else», оно присваивается некоторому случайному числу около 50-х (например, 53). Я не вижу, где проблема. Небольшая помощь будет оценена. Большое спасибо.

1 Ответ

2 голосов
/ 02 июля 2011

Я только что узнал, где проблема. Мне пришлось преобразовать входное значение рейтинга в тип double. Итак, следующий код работает так, как и предполагалось:

class RatingController {

    def springSecurityService

    static scaffold = true

    def rate = {
        def rating = params.rating.toDouble()
        def artist = Artist.get( params.id )
        def currentUser = currentUser()

        if(! currentUser.ratings.artist.contains(artist)){
           currentUser.addToRatings(new Rating(artist:artist, rating:rating)).save()
           render(template: "/artist/rate", model: [artist: artist, rating: rating])
        }

        else{
           currentUser.ratings.find{it.artist==artist}.rating = rating
           currentUser.save()
           render(template: "/artist/rate", model: [artist: artist, rating: rating])
        }
   }

   private currentUser(){
        return User.get(springSecurityService.principal.id)
   }
   }
...