Playframework路由问题

4

我在我的应用程序路由文件中有以下内容:

GET    /new                 Tweets.create
POST   /new                 Tweets.save

根据我的观点,我正在创建一个如下所示的表单:

#{form @save()}
...
#{/form}

但是当我提交表单后,它将我发送到/tweets/save而不是/new。有什么办法可以解决这个问题吗?谢谢!


1
展示你的整个路由文件,而不仅仅是问题片段。正如Codemwnci所提到的,定义路由的顺序很重要。 - Mark S
3个回答

4
如果您已经尝试了以下路由方式(这是正确使用路由的方法):
#{form @Tweets.save()}

这个方法没有生效,我认为你可能把路由放错了位置。请确保它在路由文件的顶部而不是 catch-all 路由之后。路由文件按顺序处理,如果先找到 catch-all,那么它会被首先使用,你的其他路由将被忽略。catch-all 的代码如下:

*   /{controller}/{action}     {controller}.{action} 

这是导致问题的原因,我不知道顺序很重要,我把我的代码放在路由文件的底部。谢谢! - user393964

1

尝试使用

 #{form @Tweets.save()}

我认为建议使用类名与方法名。

编辑:

Play框架路由的工作方式是定义一些路由,如下所示:

GET     /clients         Clients.index

如果请求遇到URI /clients,则会被拦截到Clients.index()。如果您有另一个路由,例如:
GET     /clients         Clients.save

然后框架会忽略这个路由,因为/clients已经有一个映射了。(很可能在控制台或日志流中出现了一些错误,请检查您的日志。)

因此,您不能像那样使它工作。我明白,您请求一个反向映射,将为不同的方法返回相同的URI。但是,框架旨在拦截请求,因此它将简单地忽略您的第二个路由。

尝试分离页面。很可能您想要为两个函数呈现相同的视图。您可以在不重定向到相同URI的情况下实现这一点。


你能在浏览器上使用“显示源代码”选项并告诉我们<form>元素的“action”属性是什么吗? - ahmet alp balkan
生成的表单标签为 <form action="/tweets/save" method="POST" accept-charset="utf-8" enctype="application/x-www-form-urlencoded" > - user393964
我想我已经找到了问题所在,请再检查一遍答案。 - ahmet alp balkan
问题出在路由的顺序上...感谢您的帮助! - user393964

0

我认为(如果我没有读错)问题在于您期望错误的行为。

据我所知,您期望提交将转到Tweet.save()(POST方法),然后返回到Tweet.create()(GET方法),因为两者共享相同的路径(/new)。

实际上,Play正在调用Tweet.save(),并且它期望在Tweet.save()结束时呈现一些结果。如果您想重定向到Tweet.create(),则可以在Tweet.save()的实现结束时调用该方法,使用以下任一方法:

create(<params>);

或者

render("@create", <params>);

这应该通过302重定向到GET版本。


1
我原本期望的行为如此描述:http://www.playframework.org/documentation/1.2.1/guide9 问题在于我的路由顺序。 - user393964

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接