2016-08-05 2 views
1

Я новичок в scala. Что я делаю, пытается сделать твиттер-бота, который собирает сообщения из Reddit и публикует их в Twitter. У меня есть контроллеры, и мне нужно передать массив с отмеченными сообщениями reddit, которые пользователь хочет чирикать, От одного контроллера к другому. Я пытался использовать Singleton и кэш, но я не знаю, почему это не работает для меняКак я могу передать Array от одного контроллера к другому

RedditController:

var pickedToTwitter : List[RedditJsonData] = _ 
    def pickedRedditsPost = Action { implicit request => 

    redditsForm.bindFromRequest.fold(
     formWithError => { 
     formWithError.errors.foreach(er => Logger.debug(er.message)) 
     Ok(views.html.main("asd")(Html("error"))) 
     }, 
     goodOne => { 
     sessionCache.set("1",pickedToTwitter = redditsJson.filter(el => goodOne.redditsList(redditsJson.indexOf(el)).checked)) 

     //Ok(views.html.main("asd")(Html(pickedToTwitter.mkString))) 
     Redirect("/redditsSend") 
     } 
    ) 
    } 

TwitterController

val tweet : Option[List[RedditJsonData]] = sessionCache.get[List[RedditJsonData]]("1") 


    def send = Action.async { request => 
     //for(i <- 0 to tweet.toList.length) { 
     val data = Map(
     "status" -> "asf" 
    ) 

     var rt: RequestToken = new RequestToken(request.session.get("token").get, request.session.get("secret").get) 

     ws.url("https://api.twitter.com/1.1/statuses/update.json?status=" + tweet.get(0).url).sign(OAuthCalculator(KEY, rt)).post("ignored").map(response => { 
     Ok(views.html.main("asd")(Html(response.body))) 
     //Redirect(response.body) 
     }) 
    //} 
    } 
+0

Я не понимаю, что вы пытаетесь сделать. Контроллер A получает запрос. Затем он создает некоторый массив, а затем вы хотите кэшировать его, чтобы к нему мог получить доступ другой более поздний запрос, поступающий на ControllerB? – mfirry

+0

как вам удалось получить сеансовый кеш? Введенный? – sascha10000

+0

@mfirry Да, у меня есть массив reddits, и я хочу передать этот массив другому контроллеру, чтобы я мог чирикать, что reddits. – neckobik

ответ

0

В моем примере вы видите Синглтон и кеш. Вы должны быть осторожны с импортом, если они слегка ошибаются, все падает. Я не получал CacheAPI для работы, ошибка требует большего внимания, как кажется.

одноэлементных:

package controllers.singletons 
import javax.inject.Singleton 

@Singleton 
class Test() { 
    val message:String = "Test" 
} 

Контроллер Применение:

package controllers 
import javax.inject.Inject 
import controllers.singletons.Test 
import play.api.Play.current 
import play.api.cache._ 
import play.api.mvc._ 

class Application @Inject()(test:Test)extends Controller { 
    def index = Action { 
    Cache.set("a", "this is a test") 
    Ok(views.html.index(test.message)) 
    } 
} 

Контроллер CacheTest:

package controllers 
import play.api.cache.Cache 
import play.api.Play.current 
import play.api.mvc.{Action, Controller} 

class CacheTest extends Controller{ 
    def cache = Action { 

    Ok(views.html.cacheWorks(Cache.get("a").getOrElse("Not Working").asInstanceOf[String])) 
    } 
} 

У меня есть два маршрута

GET /       controllers.Application.index 
GET  /cache      controllers.CacheTest.cache 

И есть две страницы HTML, которые получают содержимое кеша и singleton и отображают его. Я думаю, это то, что вы можете видеть из кода, который довольно прямолинейный.

+0

Спасибо, очень помог мне с Синглтоном. – neckobik

+0

вы также можете вводить в качестве члена, но это, похоже, не так хорошо работает, если вы хотите иметь его «val», а не «var». Имейте в виду, что это не спасение от параллелизма. Было бы лучше использовать актера. Если хотите, я могу привести пример. – sascha10000

+0

Если вы можете привести пример, это было бы здорово! – neckobik

Смежные вопросы