2012-10-21 48 views
0

這是從附帶的Play框架斯卡拉+播放框架:動作組合物的解釋需要

def IsAuthenticated(f: => String => Request[AnyContent] => Result) = Security.Authenticated(username, onUnauthorized) { user => 
    Action(request => f(user)(request)) 
    } 

因此,一個樣本所採取的行動的組合物,Security.Authenticated需要一個username: RequestHeader => Option[String]onAuthorized: RequestHeader=>SimpleResult和括號的第二組採取String => Action[A]

然後在控制我有:

def index = isAuthenticated { ...code }} 

的上面的代碼是這個,所以我認爲這是f函數=> String => Request[AnyContent] => Result。現在,我不明白的是這裏真正發生的事情。我不是在談論User.findByEmail....,我正在談論username => _ => ...。如果我直接調用它,這個函數的簽名會是什麼樣子?

username => _ => 
    User.findByEmail(username).map { user => 
     Ok(
     html.dashboard(
      Project.findInvolving(username), 
      Task.findTodoInvolving(username), 
      user 
     ) 
    ) 
    }.getOrElse(Forbidden) 

如果有def isAuthenticated(f: => Request[AnyContent] => Result)我會知道如何使用它,我會理解它。但額外的「數據」令我感到困惑。

UPDATE:

我想我發現了一些:

def f2: String => Int => List[Char] = x => _ => x.toList 

,這將被稱爲:

f2("Andrew")(2) //there can be anything replacing 2 because I don't have access to it anyway 

所以上面我問主要的功能大約是:

def f: => String => Request[AnyContent] => Result = username => _ => User.find..... 

我對不對?
我收到「No by name參數允許此處出錯」。

如果他們不使用第二個參數,他們爲什麼使用String => Request => Result而不僅僅是String => Result

+1

也許有時你需要第二個參數:https://github.com/playframework/Play20/blob/master/samples/scala/zentasks/app/controllers/Projects.scala#L38 –

回答