如何在资源模型名称与路径或控制器不匹配时编写路由

时间:2012-01-20 01:38:16

标签: ruby-on-rails rest routing rails-routing

我有一个名为ImplicitTest的模型。它被称为有一个名为Test的Ruby对象,它在Rails中打破了很多东西。

但是,我仍然希望将其作为RESTful资源公开为test(例如/tests/test/1/edit等等。此外,将控制器保持为TestsController会很棒,尽管这不太重要。

我通过在routes.rb文件中使用简单的resources :tests行来执行此操作,但这对于RESTful表单(例如<%= form_for @test ... > - 失败了 - 这表明@test对象的类型为ImplciitTest ,并尝试查找不存在的implicit_test_path

我尝试添加form_for选项,但得出的结论是,为了使表单适用于newedit操作,没有一种单一,统一的方式要求form_for()使用路径名查找的前缀不同。

所以我一直试图从路由方面解决问题。我可以在路线文件中添加一行,以便我:

  1. 拥有一个名为ImplicitTest的模型
  2. 将路径设为/ test
  3. 使用&lt;%= form_for @test ...%&gt;标签仍然
  4. 将控制器保持为TestsController(可选)
  5. 我知道我正在离开Golden Path来做这件事,但是Rails并没有让我使用Test作为模型名称,但这是用户希望在此资源的URL中看到的名称,所以我是希望有简单的路由选项来实现这一点。

2 个答案:

答案 0 :(得分:8)

您需要做的就是在路线上设置:path选项:

resources :implicit_tests, :path => '/test'

您仍然会以这种方式使用标准implicit_tests_path帮助程序,因此您的代码不必分散以更改URL方案。

答案 1 :(得分:1)

在看到coreyward的答案时,我偶然发现了一种更短但不太直观的方法来获得我需要的东西:

resources :tests, :as => "implicit_tests"

这些基本上是做同样的事情(考虑到我在评论中添加了额外的:controller开关)?或者是首选?