2011-05-18 74 views
4

我在我的applcation routes文件有这个Playframework路线问题

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

但一旦是提交它的发送形式我到/tweets/save而不是/new。任何想法如何解决这个问题?谢谢!

+1

显示您的整个路线文件,而不仅仅是相关的代码段。正如Codemwnci所述,您定义路线的顺序非常重要。 – 2011-05-19 07:26:36

回答

5

如果你已经尝试下面的路线(这是使用路线的正确方法)

#{form @Tweets.save()} 

,这没有工作,我想你可能已经把你的路线错了地方。确保它位于路线文件的顶部,而不是在全部路线之后。路径文件按顺序处理,所以如果找到了catch-all,则首先使用该路由文件,并忽略其他路由。全部看起来像

* /{controller}/{action}  {controller}.{action} 
+0

这是导致这个问题,我不知道顺序重要,我把我的代码放在我的路线文件的底部。谢谢! – networkprofile 2011-05-19 10:02:10

1

使用

#{form @Tweets.save()} 

我认为这是建议与方法名称中使用类名尝试。

编辑:

播放架构路由的工作方式是你定义为

GET  /clients   Clients.index 

一些路线如果与URI /clients遇到了一个请求,那么它将被截获Clients.index()。如果您有其他路由,以便将

GET  /clients   Clients.save 

然后框架会忽略此路由,因为/clients AREADY有一个映射。 (很可能它在控制台或日志记录流中给出了一些错误,请检查你的日志。)

因此你不能使它像那样工作。我看到,你请求了一个反向映射,它将为不同的方法返回相同的URI。然而,该框架旨在拦截请求,以便它会忽略你的第二个路由。

尝试分开页面。很可能你想要的是为两个函数渲染相同的视图。你可以做到这一点,而不必将它们重定向到相同的URI。

+0

这没有什么区别.. – networkprofile 2011-05-18 23:02:43

+0

你可以在浏览器上使用'show source'选项并告诉我们'

'元素的'action'属性是什么? – 2011-05-18 23:52:22

+0

生成的表单标签是'' – networkprofile 2011-05-19 00:44:46

0

我认为(如果我没有误读),问题是你期待错误的行为。

据我所知,你期望提交将发送到Tweet.save()(POST方法),然后返回到Tweet.create()(GET方法),因为它们都共享相同的路径(/ new)。

实际上,Play正在调用Tweet.save(),它期望Tweet.save()结束时的渲染显示一些结果。如果你想重定向到Tweet.create(),你可以在Tweet实现结束时对该方法进行调用。保存(),与任一:

create(<params>); 

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

以及应当(经由302)重定向到GET版本。

+1

我期待着这里描述的行为:http://www.playframework.org/documentation/1.2.1/guide9问题是我的路线顺序。 – networkprofile 2011-05-19 10:04:14