I was doing some simple testing with play-slick. I first used DB.withSession {implicit s:Session => ...}
in Global.scala
, and it works very well. Then I tried to use DBAction{}
in my controller, and things start to fall apart.
package controllers
import play.api.mvc._
import play.api.db.slick._
import play.api.Play.current
import models._
object Main extends Controller {
def index = DBAction { implicit s =>
Articles.insert(Article(None,"title1", "hellothere", Some(timeStamp), Some(timeStamp), None))
Ok(views.html.index.render("OK, It works"))
}
}
The model looks like this (I'm skipping the DAO
trait, case class, and the cake-pattern):
object Articles extends DAO {
/* Insert a new Article */
def insert(article: Article)(implicit s: Session) {
Articles.insert(article)
}
}
I tried to run this program, and all I got was the forever server pending status. Everything else works fine, my Global.scala
created all tables correctly, and if I remove that Articles.insert()
clause, I get my view page. So I would say something must be wrong with this part: DBAction { implicit s=> ...}
. I somehow feel like DBAction couldn't find the implicit session, and it keeps looking...which causes this forever pending response.
Well, I searched for it and still don't know what to do. Does anyone know what's wrong here and how should I fix it?
DBAction puts the session down a layer. So in your code above "s" is actually getting set to the request. You could call s.dbSession and get it that way.
I had a similar issue and that is how I resolved it. There has to be a better way to get the session though. If someone else has a better suggestion I would like to know as well.