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

Posted

技术标签:

【中文标题】资源模型名称与路径或控制器不匹配时如何编写路由【英文标题】:How to write routing when resource model name does not match path or controller 【发布时间】:2012-02-14 16:28:16 【问题描述】:

我有一个名为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() 使用不同的前缀路径名查找。

所以我一直在尝试从路由方面解决问题。是否有一行我可以添加到路由文件中以允许我:

    有一个名为 ImplicitTest 的模型 路径为 /test 仍然使用 标签 将控制器保留为 TestsController(可选)

我知道我要离开 Golden Path 来执行此操作,但 Rails 不允许我使用 Test 作为模型名称,但这是用户希望在此资源的 URL 中看到的名称,所以我希望有简单的路由选项可以实现这一点。

【问题讨论】:

【参考方案1】:

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

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

您仍然可以通过这种方式使用标准的 implicit_tests_path 帮助程序,因此您的代码不必为了更改 URL 方案而发散。

【讨论】:

这似乎没有调整控制器名称,但将其调整为resources :implicit_tests, :controller => "tests", :path => "tests" 似乎添加了它。【参考方案2】:

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

resources :tests, :as => "implicit_tests"

这些本质上是否在做同样的事情(考虑到我在 cmets 中添加的额外 :controller 开关)?还是首选?

【讨论】:

您当然也可以这样做,但是对您的隐式测试控制器和模型的混合引用,其名称并不真正符合“Rails 方式”,这开始变得令人困惑。 啊,好吧,想了很多。很高兴尝试尽可能靠近铁路,所以我会接受你的回答。也可能会回到使用 ImplicitTestController,以保持路由选项的数量较少,并使控制器名称更接近模型名称,这可能比让它更接近路径名称更好;基本上是你上面的建议。

以上是关于资源模型名称与路径或控制器不匹配时如何编写路由的主要内容,如果未能解决你的问题,请参考以下文章

当多个路径匹配时,Express 如何知道使用哪个路由器路径?

Web Api 属性路由与 POST 请求不匹配

站点路径上的资源控制器?

创建路由时如何指定应该使用哪些控制器?

Android:如何在状态栏中获取电池图标资源 ID 或完整文件路径/名称?

如何在给定路径下查找具有与递归精确模式匹配的位置的目录名称列表[重复]