2016-08-05 162 views
1

我是scala新手。我在做什麼是試圖讓twitter bot收集來自Reddit的帖子併發布到Twitter。我必須控制器,我需要傳遞一個標記爲reddit文章的數組,該用戶想要推特,從一個控制器到另一個。我試着用辛格爾頓和高速緩存,但是,我不知道爲什麼,它不是爲我工作如何將陣列從一個控制器共享到另一個控制器

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

你是如何獲得sessionCache的?注射? – 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頁面正在獲取緩存和單例內容並顯示它。我認爲這就是你可以從代碼中看到的,這很簡單。

+0

謝謝你,幫助我與辛格頓很多。 – neckobik

+0

你也可以注入成員,但是如果你想讓它成爲「val」而不是「var」,那麼這似乎不能很好地工作。請記住,這不是真正的併發保存。使用Actor最好。如果你想我可以提供一個例子。 – sascha10000

+0

如果你可以舉一個例子,那會很棒! – neckobik

相關問題