正如Rails Guide on Routing中所解释的那样,一个足智多谋的路由声明,如
resources :photos
生成一套路线和助手。其中一条路线是
/photos/:id/edit
随之而来的是帮助edit_photo_path(photo)
器,它接受一个photo
对象并返回用于编辑它的路径。 我在任何地方都使用助手,并希望他们继续按原样工作。
好吧,由于各种原因,这个应用程序正在生成自定义 ID,并且 ID 可能看起来像64/edit
或看起来像64
. 这当然会导致问题,因为无论约束或调整如何
/photos/64/edit
要么被解释为#edit 64
要么#show 64/edit
,没有一个总是正确的。
我想实现的解决方案是保留资源丰富的路由器的所有好处,包括能够将对象传递到路径助手中,并且只需将 Rails 的默认编辑路径更改为
/photos/edit/:id
那么所有的路径都是明确的。有没有(相当简单和干净)的方法来做到这一点?
笔记
- 我有一个解决方法,所以请不要提供解决方法。
- 任何解决方案都必须更新帮助程序,以便
edit_photo_path(photo)
生成/photos/edit/:id
嵌套资源并且还可以使用嵌套资源。例如,edit_magazine_photo_path(@magazine, @photo)
将产生/magazines/:magazine_id/photos/edit/:id
. - 我有多个资源,所以我不想用特殊的覆盖来扩大我的 routes.rb 的大小。
edit
我知道我可以使用该path_names
选项更改部分的路径名。(这实际上是我所做的,在重命名的编辑路径中放置一个永远不会出现在 ID 中的 Unicode 字符,但现在我让用户看到我不喜欢的 Unicode URL,一旦 ID 出现,这将失败扩展为 Unicode 字符串。)- 我知道我可以编写自定义
match
规则,但是使用嵌套资源会变得非常乏味和困难,尤其是在生成获取对象的路径助手时。 - 我阅读了“删除 url 的编辑后缀”问题的答案,但事实上,该答案并没有删除编辑后缀,它改变了 URL 的不同部分。
- 我真的很想深入了解资源路由生成的内部工作原理,尤其是 URL 助手,这样我就可以切换路径的顺序
edit
和id
路径。