我有两条相同的路线(见下文),它们可以通过两个不同的按钮激活,这两个按钮可以调用两个不同的按钮。
我的情景是:
我在同一页面上有两个按钮(“发布版本”和“发布版本”)。对于每个按钮,我调用一个不同的远程方法(exec_client和exec_release)。
所以,对于路线歧义的问题(我认为......)我无法调用我在routes.rb上定义的第二个函数。每当我点击“发布版本”按钮时,我都会调用exec_client方法,而这个按钮应该调用exec_release方法。
我的问题是:我该怎么做才能解决它?
在我的路线代码下面,我认为是代码问题。
match 'projects/:id/repository', :action => 'exec_client', :controller => 'repositories', :via => :post
match 'projects/:id/repository/:branch', :action => 'exec_client', :controller => 'repositories', :via => :post
match 'projects/:id/repository', :action => 'exec_release', :controller => 'repositories', :via => :post
match 'projects/:id/repository/:branch', :action => 'exec_release', :controller => 'repositories', :via => :post
如果您需要我的另一段代码,请询问,我会放在这里。
答案 0 :(得分:1)
Rails路由具有基于routes.rb文件中位置的优先级。简单解释发生的事情:你的一些路线比其他路线更“普通”。所以,例如:
match 'projects/:id/repository', :action => 'exec_client', :controller => 'repositories', :via => :post
match 'projects/:id/repository/:branch', :action => 'exec_client', :controller => 'repositories', :via => :post
无法触发第二条路线,因为/projects/:id/repository
的请求将被路由到exec_client
操作,即使它们具有:branch
参数(实际上是任意数量的参数)。因此,您需要遵循以下简单约定:文件开头的更具体路由,文件末尾的更常见路由。
此外,使用相同的路线(相同的uri和HTTP动词)是不好的做法。根据路线优先级,您将始终触发最高变量(前一个定义的变量)。您可以做的最简单的事情就是为每个行动制定单独的路线。
所以,这是一个应该让你前进的例子:
match 'projects/:id/repository/publish', :action => 'exec_client', :controller => 'repositories', :via => :get
match 'projects/:id/repository/release', :action => 'exec_release', :controller => 'repositories', :via => :get
这将为您的操作创建两个单独的路径。从我所看到的 - :branch
参数是可选的。您可以在控制器代码中检查它是否存在。另外,我建议你阅读Rails Guide: Routing。这样,您就可以了解REST和Rails路由基础知识。