2011-10-27 27 views
3

我試圖檢索一個CometActor內的url參數,以驗證數據的來源與目的地相匹配,例如,用戶從房間A發送消息,應該是隻有在一個房間接收並顯示,而不是B或C.SCALA電梯 - 彗星內S.param訪問演員

我已經試過:

S.param("message").openOr("") 

但它總是空的,可以這樣做?還是有另一種方法可以阻止Comet消息走向他們不應該去的地方?提前任何幫助

謝謝,非常感謝:)

回答

4

CometActors會話之外存在,因此不必訪問(大部分)它。解決方案是使用包含所需會話數據的初始化消息初始化actor。在LiftRules中有一些助手可以做到這一點。我正在打電話,從記憶中回顧這一點,但希望這足以繼續下去。

具體來說,你會想要做的事,如:

for (
    session <- S.session 
    message <- S.param("message") 
) { 
    session.setupComet("myCometActor", Some("unique name, if you want it"), message) 
} 

Boot.scala

退房LiftSession多一點。我覺得可能是掛接到LiftRules有呼籲會話創建相關的代碼的方式...

更新:這裏是你的CometActor可能是什麼樣子,如果我們發送包含案例類:

// ... 
session.setupComet(
    "myCometActor", 
    Some("unique name, if you want it"), 
    Message(message) 
) 
// ... 
case class Message(text: String) 

class CometMessage extends CometActor { 
    override def lowPriority = { 
    case Message(text) => { 
     // do something here with the text, whether settings a SessionVar or even just a plain var 
    } 
    } 
} 
+0

好吧。我現在需要知道的是如何從彗星演員中訪問這些消息。謝謝 – jhdevuk

+0

您在其中一個消息處理程序中收到它們,如'lowPriority'。 – pr1001

+0

您可以給出一個基本示例,例如所謂的方法,例如S.param(「room」),其中「room」等於傳遞的參數。再次感謝 – jhdevuk

0

Lift's mailing list

CometActors HTTP請求/響應循環的外存在。這意味着在CometActor中處理消息的過程中,您不會看到Req,因爲Req從未作爲消息處理的一部分提供給Req。

相反,一些在此線程的帖子時,S上下文可作爲是SessionVars(但不是RequestVars因爲CometActor是一個請求的範圍的外部)。

(...)

最好的辦法是創建一個SessionVar(或幾個SessionVars)持有的主機和端口。從片段中設置這些SessionVars(如果它們尚未設置)。然後從您的CometActors訪問SessionVars。

這是一種可能的選擇。但是,我個人的偏好是使用NamedCometActorSnippet插入彗星頁面,並立即將消息發送到創建彗星:所以我用你的方法通過加載所有的彗星演員該網頁摘錄在這裏

class MyCometSnippet extends NamedCometActorSnippet { 

    val cometClass = "MyComet" 
    val name = "MyComet-instance" 

    for { 
    liftSession <- S.session 
    processingMode <- S.param("message") 
    } yield { 
    liftSession.sendCometActorMessage(cometClass, Full(name), SetMessageValue(message)) 
    } 
}