我在我的应用程序路由文件中有以下内容:
GET /new Tweets.create
POST /new Tweets.save
根据我的观点,我正在创建一个如下所示的表单:
#{form @save()}
...
#{/form}
但是当我提交表单后,它将我发送到/tweets/save
而不是/new
。有什么办法可以解决这个问题吗?谢谢!
我在我的应用程序路由文件中有以下内容:
GET /new Tweets.create
POST /new Tweets.save
根据我的观点,我正在创建一个如下所示的表单:
#{form @save()}
...
#{/form}
但是当我提交表单后,它将我发送到/tweets/save
而不是/new
。有什么办法可以解决这个问题吗?谢谢!
#{form @Tweets.save()}
这个方法没有生效,我认为你可能把路由放错了位置。请确保它在路由文件的顶部而不是 catch-all 路由之后。路由文件按顺序处理,如果先找到 catch-all,那么它会被首先使用,你的其他路由将被忽略。catch-all 的代码如下:
* /{controller}/{action} {controller}.{action}
尝试使用
#{form @Tweets.save()}
我认为建议使用类名与方法名。
编辑:
Play框架路由的工作方式是定义一些路由,如下所示:
GET /clients Clients.index
/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我认为(如果我没有读错)问题在于您期望错误的行为。
据我所知,您期望提交将转到Tweet.save()(POST方法),然后返回到Tweet.create()(GET方法),因为两者共享相同的路径(/new)。
实际上,Play正在调用Tweet.save(),并且它期望在Tweet.save()结束时呈现一些结果。如果您想重定向到Tweet.create(),则可以在Tweet.save()的实现结束时调用该方法,使用以下任一方法:
create(<params>);
或者
render("@create", <params>);
这应该通过302重定向到GET版本。