2016-07-30 55 views
0

我需要在视图中创建URL时隐式传递一些变量。播放框架2:隐式值视图

我有行动控制器:

class HomeController extends Controller{ 

    def index(implicit lang: Lang) = Action.async { implicit request => { 
     Future[Result] { 
     Ok(views.html.home.index(lang)) 
     } 
    } 

    ... 
    } 

这里是index.scala.html片段:

@()(implicit lang: Lang) 
@main("Home page") { 
    <ul> 
     <li><a href="@routes.HomeController.index()"><span>Home</span></a> 
    ... 
    </ul> 
} 

但我在@ routes.HomeController.index编译错误( ),方法没有足够的参数

为什么它是一个错误?我如何隐式通过变量创建网址?

+0

从反向路由调用中删除括号:'@ routes.HomeController.index'。尽管你可能最终会遇到问题,试图在'index'方法中使用隐式'Lang'。 –

+0

我试过这个,还没有工作。 “在类ReverseHomeController中缺少方法索引的参数” – Teimuraz

+0

保持parens并尝试“def index()(implicit lang:Lang)' –

回答

1

试试这个:

class HomeController extends Controller { 
def index = Action.async { implicit request => { 
     Future[Result] { 
     Ok(views.html.home.index) 
     } 
    } 
    ... 
    } 

不显式地传递朗PARAM进入功能。播放Controller包含从请求到lang的暗示转换,此lang将自动提供到您的视图中。

+0

我必须在index方法中使用lang param,因为我已经定义了这样的路由:GET/$ lang controllers.HomeController.index(lang:play.api.i18n.Lang)。基本上,我不需要在索引方法中通过lang param,我只需要路由/ 中的一部分,(实际的语言解析器是过滤器中的处理程序,这个我只需要路由)。但没有/ $ lang ...它不起作用,如果我在路由模式中提供$ lang,比我应该将它传递给索引方法,否则我得到编译器错误 – Teimuraz

+0

我不知道我理解你的问题,但是如果你想在方法中保留lang参数,那么你需要以这种方式重新查看'Ok(views.html.home.index()(lang))' – mgosk