我需要访问当前会话的域类User。以下代码有效:
class RatingController {
def rate = {
def rating = params.rating
def artist = Artist.get( params.id )
def user = User.get(1)
user.addToRatings(new Rating(artist:artist, rating:rating))
user.save()
render(template: "/artist/rate", model: [artist: artist, rating: rating])
}
}
但是我没有显式地获取ID等于1的用户(User.get(1)),而是需要访问当前会话的用户。我尝试了以下代码,但它不起作用:
class RatingController {
def rate = {
def rating = params.rating
def artist = Artist.get( params.id )
def user = user.session
user.addToRatings(new Rating(artist:artist, rating:rating))
user.save()
render(template: "/artist/rate", model: [artist: artist, rating: rating])
}
}
我仍然在努力完全理解httpSession概念,所以一点帮助就会很棒。 提前谢谢。
更新
在我的UserController中,我的身份验证如下所示:
def authenticate = {
def user = User.findByLoginAndPassword(params.login, params.password)
if(user){
session.user = user
flash.message = "Hello ${user.name}!"
redirect(controller:"event", action:"list")
}else{
flash.message = "Sorry, ${params.login}. Please try again."
redirect(action:"create")
}
}
答案 0 :(得分:3)
http会话只不过是来自单一来源(如浏览器)的一系列请求之间维护的数据。
要在会话中添加内容,只需执行
session.setAttribute("key", value)
并从会话中获取数据
session.getAttribute("key")
Grails还为会话访问添加了一些好看,如here所示。他们的例子显示
def user = session["user"]
session["user"] = "John"
asset "John" == session.user
请注意,如果您使用grails插件进行身份验证和授权,则可能会提供一种获取用户的方法。例如,Spring Security为您提供以下内容
springSecurityService.getCurrentUser()
取决于插件的详细信息,该用户可能会或可能不会在会话中。
答案 1 :(得分:2)
在你的代码中,我注意到你写了
def user = user.session
我认为你的意思
def user = session.user
我做的另一件事是将它作为session.userId,即session.userId = user.id
然后
def user = User.get(session.userId)
不确定是否有必要。
答案 2 :(得分:1)
您需要使用.merge():
user.merge(flush: true)
这是因为当您将实例保存到HttpSession时,实例会从持久性上下文中分离出来。这是来自grails的文档: http://grails.org/doc/2.3.1/ref/Domain%20Classes/merge.html